【问题标题】:Format string with MaskFormatter throws "Invalid character" exception使用 MaskFormatter 格式化字符串会引发“无效字符”异常
【发布时间】:2020-08-11 11:02:53
【问题描述】:

我有一个函数,我需要将字符串设置为以下格式:#####-####-## 并用前导零填充。

例如:

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;
    }
}

【问题讨论】:

    标签: java intellij-idea maskformatter


    【解决方案1】:

    这里是如何修复 ERROR java.text.ParseException: Invalid character: ... in 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;
        }
    

    【讨论】:

    • 谢谢,如果我理解正确,我需要自己填充前导零吗?
    • 是的,但至少你没有这样的错误:java.text.ParseException: Invalid character: ...
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多