【问题标题】:check if currency has valid symbol检查货币是否具有有效符号
【发布时间】:2021-07-05 16:21:07
【问题描述】:

我有一个代表货币价值的字符串,例如 $200、€200、¥200。

根据我的任务,我只支持美元、欧元和日元,但不支持其他货币符号。

我想获取字符串的第一个字符并检查它是否是有效的货币符号,这意味着它是欧元或美元或日元,但不是其他货币。在 Java 中如何做到这一点?

这是我的示例代码:

char c = s.charAt(0);

if(c == dollar || c == euro || c == yen) { // how can I write the symbols in my code?
   valid = true;
} else {
   valid = false;
}

【问题讨论】:

  • 你试过写...符号吗? '$', '€', '¥'.
  • 您可以使用货币符号的unicode或带有货币符号的键值对
  • @AndyTurner,我不想在我的代码中使用日元或欧元等特殊字符
  • @abhinavxeon,你能告诉我如何处理 unicode 吗?
  • 您只需使用\u。因此,在您的情况下,$ 将是 \u0024 将是 \u20AC¥ 将是 \u00A5。 java 词法分析器将在您进一步了解它们之前将它们转换为它们的 unicode 等价物,因此这将产生完全相同的类文件。唯一的区别在于您的源文件。

标签: java currency


【解决方案1】:

这比你想象的要容易:

if(c == '$' || c == '€' || c == '¥')

您说您不想在代码中使用“特殊符号”...我不明白您为什么不这样做;但是您可以根据需要将欧元和日元符号分别写为'\u20AC''\u00A5'(但请注意,Java 编译器所做的第一件事是将它们转换回¥....)

使用 unicode 符号而不是 \uNNNN 的一个重要原因是可读性:很容易不小心弄错代码,而且不容易被发现。而且,大概,您将为代码编写测试——您在测试中使用什么来确保它做正确的事情?如果您使用\uNNNN 表单,您也将面临错误的风险;如果您在测试中使用该符号,那么您也可以在生产代码中使用该符号。

【讨论】:

    【解决方案2】:

    你可以用 unicode 做到这一点

    import java.util.Arrays;
    import java.util.List;
     
    // Convert list of Characters to string in Java
    class Main
    {
        public static void main(String[] args)
        {  String s="$200";
            char c = s.charAt(0);
            List<Character> currency = Arrays.asList('\u0024', '\u20AC', '\u20AC');
            
            if(currency.contains(c))
            System.out.println("true");
     
           
        }
    }
    

    【讨论】:

    • c == '$' || c == '€' || c == '¥' 也是“使用Unicode”。 Java 字符 Unicode。 Java 源文件通常是 UTF-8 编码的 Unicode。
    【解决方案3】:

    一些模式匹配怎么样? 为字符串验证创建单独的类。传递要匹配字符串的货币符号Set。在类初始化时编译pattern(这是繁重的操作,所以最好只做一次并存储模式本身)。在这种情况下,您将得到类似^[$€¥]\\d+$ 的模式(这意味着 - 字符串的开头 - 方括号中的任何字符(只有一个)- 一个或多个数字 - 字符串的结尾)。然后只需将String 传递给isValid 方法并匹配模式。如果您需要更改可用货币,只需从 Set 添加或删除它们(您甚至可以从单独的 .properties 文件中获取它们)。这种方法使您的应用更加灵活。

    public class Main{
    
        public static void main(String[] args) {
            Set<String> currencySet = Set.of("$", "€", "¥");
            CurrencyValidator currencyValidator = new CurrencyValidator(currencySet);
            String value = "$200";
            System.out.println(currencyValidator.isValid(value));
        }
    
    }
    
    public class CurrencyValidator {
    
        private final Set<String> currencySet;
        private Pattern currencyPattern;
    
        public CurrencyValidator(Set<String> currencySet) {
            this.currencySet = currencySet;
            init();
        }
    
        private void init() {
            String currencyString = currencySet.stream()
                    .collect(Collectors.joining("", "^[", "]\\d+$"));
            currencyPattern = Pattern.compile(currencyString);
        }
    
        public boolean isValid(String value) {
            return currencyPattern.matcher(value).matches();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2014-04-03
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多