我有一个函数,需要将字符串设置为以下格式:#####-#####-##并用前导零填充。
例如:
1234567
将成为00001-2345-67
98765432109
将成为98765-4321-09
我正在使用MaskFormatter,从文档中我得到的印象是A
代表任何字母或数字,而setPlaceHolderCharacter
可以填充字符串。
我从技术上知道它是用于文本字段的,但是希望我可以在后端功能中使用它,如果没有的话,我应该使用其他组件吗?
我在下面有这段代码,但是当它遇到java.text.ParseException: Invalid character: 1
时会抛出一个异常mask.valueToString(ndc)
public class NdcFormatter implements MapFunction<Purchase, Purchase> {
private final String maskFormat = "AAAAA-AAAA-AA";
private final Character placeholder = '0';
@Override
public Purchase map(Purchase purchase) throws ParseException {
if(purchase != null){
String ndc = purchase.getNdc();
MaskFormatter mask = new MaskFormatter(maskFormat);
mask.setPlaceholderCharacter(placeholder);
String result = mask.valueToString(ndc);
purchase.setNdc(result);
}
return purchase;
}
}
答案 0 :(得分:1)
这是修复java.text.ParseException: Invalid character: ...
中的错误 MaskFormatter
解决方案,该错误是valueToString
方法中的问题,您必须添加以下代码行:
mask.setValueContainsLiteralCharacters(false);
但是您会遇到类似的问题:
1234567
时,它将返回12345-6700-00
00001-2345-67
,您必须通过00001234567
因此,您必须先格式化输入值。
这是完整的代码:
public class NdcFormatter implements MapFunction<Purchase, Purchase> {
private final String maskFormat = "AAAAA-AAAA-AA";
private final Character placeholder = '0';
@Override
public Purchase map(Purchase purchase) throws ParseException {
if(purchase != null){
String ndc = purchase.getNdc();
MaskFormatter mask = new MaskFormatter(maskFormat);
mask.setPlaceholderCharacter(placeholder);
mask.setValueContainsLiteralCharacters(false);
String result = mask.valueToString(ndc);
purchase.setNdc(result);
}
return purchase;
}
}
在这里自己填充前导零是一个简单的代码示例。
if(ndc.length() < maskFormat.length()) {
String pad = "0";
for(int i = 0; i < maskFormat.length() -ndc.length() - 3; i++ ) {
pad = pad + "0" ;
}
ndc = pad + ndc;
}