代码之家  ›  专栏  ›  技术社区  ›  Vicky

检查字符串是否包含Java:Locale中的小数部分

  •  2
  • Vicky  · 技术社区  · 6 年前

    我有一个 String 可以保存 Long 或者 Double . 这个 字符串 可能是 Locale 基于。

    因此它可能包含以下值:

    11
    11.00
    15,25 (for Locale like Denmark where the decimal part is denoted by a comma instead of dot)
    

    我只想在它是双精度的时候做一些事情,因为它包含一个分数值。分数值“00”也是有效的情况。

    if(string contains fraction){
      // do something
    }
    

    在上面的三个例子中,控件应该进入 if 对于 11.00 15,25 但不是11岁。

    我怎样才能检查这个?

    请记住涉及到地区。因此,对于不同的语言环境,点和逗号可能有不同的含义。所以简单的正则表达式找不到它们的出现。例如,11,00是1100,如果语言环境是澳大利亚,因此不是双精度的。但如果当地是丹麦或德国这样的欧洲国家,1100英镑是双倍。

    我需要找到一些解决方案 NumberFormat 但无法解决。

    我有现场信息。所以我知道字符串是否属于哪个地区。既然如此,我如何才能找到字符串是否有小数?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Kevin Cruijssen    6 年前

    编辑:由于您已经编辑了说明您知道区域设置的问题,因此可以将其与 NumberFormat.getNumberInstance(locale).parse(strValue) 与逗号和千位分隔符的正则表达式结合使用。这里有一个测试代码:

    import java.text.DecimalFormatSymbols;
    import java.text.NumberFormat;
    import java.text.ParseException;
    import java.util.Locale;
    
    class Main{
      private static final Locale DUTCH = new Locale("nl","NL");
    
      public static void main(String[] a){
        test("11", Locale.ENGLISH);
        test("11", DUTCH);
        System.out.println();
        test("11.00", Locale.ENGLISH);
        test("11.00", DUTCH);
        System.out.println();
        test("11,00", Locale.ENGLISH);
        test("11,00", DUTCH);
        System.out.println();
        test("15.123", Locale.ENGLISH);
        test("15.123", DUTCH);
        System.out.println();
        test("15,123", Locale.ENGLISH);
        test("15,123", DUTCH);
        System.out.println();
        test("something", Locale.ENGLISH);
        test("something", DUTCH);
      }
    
      static void test(String val, Locale locale){
        try{
          DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
          char decimalSep = symbols.getDecimalSeparator();
          char thousandSep = symbols.getGroupingSeparator();
    
          String escapedDecimalSep = decimalSep == '.' ? "\\." : decimalSep+"";
          String escapedThousandSep = thousandSep == '.' ? "\\." : thousandSep+"";
    
          String intRegex = "\\d+(" + escapedThousandSep + "\\d{3})*"; // Example ENGLISH: "\\d+(,\\d{3})*"
          String doubleRegex = intRegex + escapedDecimalSep + "\\d+"; // Example ENGLISH: "\\d+(,\\d{3})*\\.\\d+"
    
          NumberFormat format = NumberFormat.getInstance(locale);
          Number number = format.parse(val);
          if(val.matches(doubleRegex)){
            double d = number.doubleValue();
            System.out.println(val + " (in locale " + locale + ") is a double: " + d);
          } else if(val.matches(intRegex)){
            int i = number.intValue();
            System.out.println(val + " (in locale " + locale + ") is an integer: " + i);
          } else{
            System.out.println("Unable to determine whether value " + val + " is an integer or double for locale " + locale);
          }
        } catch(ParseException ex){
          System.out.println("Error occurred for value \"" + val + "\". Are you sure it's an integer or decimal?");
        }
      }
    }
    

    Try it online.

    输出如下:

    11 (in locale en) is an integer: 11
    11 (in locale nl_NL) is an integer: 11
    
    11.00 (in locale en) is a double: 11.0
    Unable to determine whether value 11.00 is an integer or double for locale nl_NL
    
    Unable to determine whether value 11,00 is an integer or double for locale en
    11,00 (in locale nl_NL) is a double: 11.0
    
    15.123 (in locale en) is a double: 15.123
    15.123 (in locale nl_NL) is an integer: 15123
    
    15,123 (in locale en) is an integer: 15123
    15,123 (in locale nl_NL) is a double: 15.123
    
    Error occurred for value "something". Are you sure it's an integer or decimal?
    Error occurred for value "something". Are you sure it's an integer or decimal?
    
        2
  •  1
  •   daniu    6 年前

    你可以用正则表达式

    Pattern decimalPattern = Pattern.compile("\\d+(,|\\.)\\d+{2}");
    

    然后有

    boolean isDecimal = decimalPattern.matcher(input).matches();
    

    正则表达式:

    • \d+ 一个或多个数字
    • (,|\\.) 小数点或逗号
    • \丁+ 再次输入一个或多个数字

    或者你可以做分裂的事

    String[] split = input.split("(,|\\.)");
    boolean isDecimal = split.length > 1 && split[1].length() == 2;
    
        3
  •  0
  •   GonzaloPani    6 年前

    您可以使用循环来检查它是否有逗号或圆点,然后使用if来检查?

    boolean IsADouble = false;
    for (int i = 0; i < String.length(); i++) {
                if (String.charAt(i) == ','|| String.charAt(i) == '.') {
                    IsADouble = true
                }
            }
    

    然后创建If to do things If it a double。

    希望对你有帮助:)