使用 MaskFormatter 格式化字符串抛出 "Invalid character" 异常
Format string with MaskFormatter throws "Invalid character" exception
我有一个函数,我需要在其中将字符串设置为以下格式:#####-####-## 并用前导零填充。
例如:
1234567
会变成 00001-2345-67
98765432109
会变成 98765-4321-09
我正在使用 MaskFormatter,文档给我的印象是 A
代表任何字母或数字,而 setPlaceHolderCharacter
会填充字符串。
从技术上讲,我知道它用于文本字段,但我希望我可以在后端函数中使用它,如果没有,我应该使用其他组件吗?
我在下面有这段代码,但它在遇到 mask.valueToString(ndc)
时抛出异常 java.text.ParseException: Invalid character: 1
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;
}
}
这是修复 MaskFormatter
中的 ERROR java.text.ParseException: Invalid character: ...
的方法
解决方法错误在valueToString
方法中,你必须添加这行代码:
mask.setValueContainsLiteralCharacters(false);
但是你会遇到这样的问题:
- 当您设置
1234567
时,它将 return 您 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;
}
我有一个函数,我需要在其中将字符串设置为以下格式:#####-####-## 并用前导零填充。
例如:
1234567
会变成 00001-2345-67
98765432109
会变成 98765-4321-09
我正在使用 MaskFormatter,文档给我的印象是 A
代表任何字母或数字,而 setPlaceHolderCharacter
会填充字符串。
从技术上讲,我知道它用于文本字段,但我希望我可以在后端函数中使用它,如果没有,我应该使用其他组件吗?
我在下面有这段代码,但它在遇到 mask.valueToString(ndc)
java.text.ParseException: Invalid character: 1
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;
}
}
这是修复 MaskFormatter
java.text.ParseException: Invalid character: ...
的方法
解决方法错误在valueToString
方法中,你必须添加这行代码:
mask.setValueContainsLiteralCharacters(false);
但是你会遇到这样的问题:
- 当您设置
1234567
时,它将 return 您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;
}