Vhrno 추가
parent
3a8a2f58f0
commit
f1f8497b4b
@ -0,0 +1,204 @@
|
|||||||
|
package cokr.xit.fims;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import cokr.xit.foundation.AbstractObject;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**자동차 등록번호 유틸리티
|
||||||
|
* @author mjkhan
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class Vhrno extends AbstractObject {
|
||||||
|
public static final String PASSENGER = "passenger";
|
||||||
|
public static final String VAN = "van";
|
||||||
|
public static final String TRUCK = "truck";
|
||||||
|
public static final String SPECIALTY = "specialty";
|
||||||
|
public static final String EMERGENCY = "emergency";
|
||||||
|
public static final String UNKNOWN = "unknown";
|
||||||
|
|
||||||
|
private static final Pattern
|
||||||
|
newPrivate = Pattern.compile("^(\\d{2,3})([가-힣])(\\d{4})$"),
|
||||||
|
commercial = Pattern.compile("^([가-힣]{2,3})([가-힣])(\\d{4})$"),
|
||||||
|
etc = Pattern.compile("^([가-힣]{2,3})(\\d{2,3})([가-힣])(\\d{4})$");
|
||||||
|
private static final List<String> diplomatic = List.of("외교", "영사", "준외", "준영", "국기", "협정", "대표");
|
||||||
|
|
||||||
|
private String
|
||||||
|
region,
|
||||||
|
type,
|
||||||
|
usage,
|
||||||
|
number,
|
||||||
|
fullNumber;
|
||||||
|
|
||||||
|
/**전체 등록번호를 설정하고, 지역, 차종, 용도, 번호로 구분하여 초기화한다.
|
||||||
|
* @param fullNumber 전체 등록번호
|
||||||
|
* @return 현재 Vhrno
|
||||||
|
*/
|
||||||
|
public Vhrno setFullNumber(String fullNumber) {
|
||||||
|
region = type = usage = number = null;
|
||||||
|
this.fullNumber = fullNumber;
|
||||||
|
|
||||||
|
Matcher matcher = newPrivate.matcher(fullNumber);
|
||||||
|
if (matcher.matches())
|
||||||
|
return setType(matcher.group(1)).setUsage(matcher.group(2)).setNumber(matcher.group(3));
|
||||||
|
matcher = commercial.matcher(fullNumber);
|
||||||
|
if (matcher.matches())
|
||||||
|
return setRegion(matcher.group(1)).setUsage(matcher.group(2)).setNumber(matcher.group(3));
|
||||||
|
matcher = etc.matcher(fullNumber);
|
||||||
|
if (matcher.matches())
|
||||||
|
return setRegion(matcher.group(1)).setType(matcher.group(2)).setUsage(matcher.group(3)).setNumber(matcher.group(4));
|
||||||
|
|
||||||
|
for (String str: diplomatic) {
|
||||||
|
if (fullNumber.contains(str)) {
|
||||||
|
setUsage(str);
|
||||||
|
setNumber(fullNumber.replace(str, "").trim());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**차종을 반환한다.
|
||||||
|
* @return 차종
|
||||||
|
* <ul><li>{@link #PASSENGER} - 승용차</li>
|
||||||
|
* <li>{@link #VAN} - 승합차</li>
|
||||||
|
* <li>{@link #TRUCK} - 화물차</li>
|
||||||
|
* <li>{@link #SPECIALTY} - 특수차</li>
|
||||||
|
* <li>{@link #EMERGENCY} - 긴급차</li>
|
||||||
|
* <li>{@link #UNKNOWN} - 알 수 없음</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public String getVehicleType() {
|
||||||
|
int num = toInt(type);
|
||||||
|
if ((num >= 1 && num <= 69) || (num >= 100 && num <= 699))
|
||||||
|
return PASSENGER;
|
||||||
|
if ((num >= 70 && num <= 79) || (num >= 700 && num <= 799))
|
||||||
|
return VAN;
|
||||||
|
if ((num >= 80 && num <= 97) || (num >= 800 && num <= 979))
|
||||||
|
return TRUCK;
|
||||||
|
if ((num >= 98 && num <= 99) || (num >= 980 && num <= 997))
|
||||||
|
return SPECIALTY;
|
||||||
|
if (num >= 998 && num <= 999)
|
||||||
|
return EMERGENCY;
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 차종의 대여사업용 차량인지 반환한다.
|
||||||
|
* @param vehicleType 차종
|
||||||
|
* <ul><li>{@link #PASSENGER} - 승용차</li>
|
||||||
|
* <li>{@link #VAN} - 승합차</li>
|
||||||
|
* <li>{@link #TRUCK} - 화물차</li>
|
||||||
|
* <li>{@link #SPECIALTY} - 특수차</li>
|
||||||
|
* <li>{@link #EMERGENCY} - 긴급차</li>
|
||||||
|
* <li>{@link #UNKNOWN} - 알 수 없음</li>
|
||||||
|
* </ul>
|
||||||
|
* @return 주어진 차종의 대여사업용 차량 여부
|
||||||
|
*/
|
||||||
|
public boolean isRental(String vehicleType) {
|
||||||
|
if (!equals(getVehicleType(), vehicleType)) return false;
|
||||||
|
|
||||||
|
int num = toInt(type);
|
||||||
|
return switch (vehicleType) {
|
||||||
|
case PASSENGER -> num >= 100 && num <= 699;
|
||||||
|
case VAN -> num >= 700 && num <= 799;
|
||||||
|
case TRUCK -> num >= 800 && num <= 979;
|
||||||
|
case SPECIALTY -> num >= 980 && num <= 997;
|
||||||
|
default-> false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 차종의 비사업용 차량인지 반환한다.
|
||||||
|
* @param vehicleType 차종
|
||||||
|
* <ul><li>{@link #PASSENGER} - 승용차</li>
|
||||||
|
* <li>{@link #VAN} - 승합차</li>
|
||||||
|
* <li>{@link #TRUCK} - 화물차</li>
|
||||||
|
* <li>{@link #SPECIALTY} - 특수차</li>
|
||||||
|
* <li>{@link #EMERGENCY} - 긴급차</li>
|
||||||
|
* <li>{@link #UNKNOWN} - 알 수 없음</li>
|
||||||
|
* </ul>
|
||||||
|
* @return 주어진 차종의 비사업용 차량 여부
|
||||||
|
*/
|
||||||
|
public boolean isNonCommercial(String vehicleType) {
|
||||||
|
return isRental(vehicleType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**주어진 차종의 일반사업용 차량인지 반환한다.
|
||||||
|
* @param vehicleType 차종
|
||||||
|
* <ul><li>{@link #PASSENGER} - 승용차</li>
|
||||||
|
* <li>{@link #VAN} - 승합차</li>
|
||||||
|
* <li>{@link #TRUCK} - 화물차</li>
|
||||||
|
* <li>{@link #SPECIALTY} - 특수차</li>
|
||||||
|
* <li>{@link #EMERGENCY} - 긴급차</li>
|
||||||
|
* <li>{@link #UNKNOWN} - 알 수 없음</li>
|
||||||
|
* </ul>
|
||||||
|
* @return 주어진 차종의 일반사업용 차량 여부
|
||||||
|
*/
|
||||||
|
public boolean isCommercial(String vehicleType) {
|
||||||
|
if (!equals(getVehicleType(), vehicleType)) return false;
|
||||||
|
|
||||||
|
int num = toInt(type);
|
||||||
|
return switch (vehicleType) {
|
||||||
|
case PASSENGER -> num >= 1 && num <= 69;
|
||||||
|
case VAN -> num >= 70 && num <= 79;
|
||||||
|
case TRUCK -> num >= 80 && num <= 97;
|
||||||
|
case SPECIALTY -> num >= 98 && num <= 99;
|
||||||
|
default-> false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**용도가 비사업용인지 반환한다.
|
||||||
|
* @return 용도의 비사업용 여부
|
||||||
|
*/
|
||||||
|
public boolean isNonCommercial() {
|
||||||
|
return !isRental()
|
||||||
|
&& !isCommercial()
|
||||||
|
&& !isDiplomatic();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**용도가 대여사업용인지 반환한다.
|
||||||
|
* @return 용도의 대여사업용 여부
|
||||||
|
*/
|
||||||
|
public boolean isRental() {
|
||||||
|
return "허하호".contains(usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**용도가 일반사업용인지(대여사업용 제외) 반환한다.
|
||||||
|
* @return 용도의 일반사업용 여부
|
||||||
|
*/
|
||||||
|
public boolean isCommercial() {
|
||||||
|
return "바사아자배".contains(usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**외교차량 여부를 반환한다.
|
||||||
|
* @return 외교차량 여부
|
||||||
|
*/
|
||||||
|
public boolean isDiplomatic() {
|
||||||
|
return diplomatic.contains(usage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String describe() {
|
||||||
|
return String.format("%s => region: %s, type: %s, usage: %s, number: %s", fullNumber, region, type, usage, number);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return fullNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Vhrno vhrno = new Vhrno();
|
||||||
|
String str = "25오1778";
|
||||||
|
System.out.println(vhrno.setFullNumber(str).describe());
|
||||||
|
System.out.println(vhrno.setFullNumber(str = "123가4567").describe());
|
||||||
|
System.out.println(vhrno.setFullNumber(str = "서울바9867").describe());
|
||||||
|
System.out.println(vhrno.setFullNumber(str = "경기32더5678").describe());
|
||||||
|
System.out.println(vhrno.setFullNumber(str = "외교001-001").describe());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue