Java中的货币解析

Posted

技术标签:

【中文标题】Java中的货币解析【英文标题】:Currency Parsing in Java 【发布时间】:2014-11-25 15:40:27 【问题描述】:

到目前为止,我正在尝试解析一个 html 标签,我得到的文本如下:

“指导价 50,000 英镑”

“50,000 英镑”

甚至

“50,000 英镑 - 55,000 英镑”

在第三种情况下,为了让事情更简单,我只需要列出第一个价格。

我的问题是如何将以下数字转换为 int 或 double,最好是 int,因为这些数字非常大。数字格式化程序会这样做还是我需要一个正则表达式,特别是如果一些文本尾随标签块。

到目前为止的示例

String priceNumber = url.select("span.price").text();  //using JSoup Libary
String priceNumber = priceNumber.replaceAll("[^\\d.])

这会删除我认为不是数字的所有内容。 如果示例中有 2 个数字,我如何获得第一个?

【问题讨论】:

你能提供一个你现在拥有的代码示例吗? 字符串也是不可变的,所以我的例子不是很好,我需要一个字符串缓冲区的例子来选择第一个数字减去逗号、点和货币符号并将其作为整数返回 您不需要 StringBuffer(或 StringBuilder,如果您需要这样的东西,它应该是您的首选)。只需将replaceAll() 返回的值分配给一个字符串变量,就像您现在所做的那样。你的那部分代码很好。 【参考方案1】:

使用带有Matcher.find 的正则表达式来搜索匹配项,然后删除逗号并尝试解析。这是小数点:

String input = "£50,000 - £55,000";
Pattern regex = Pattern.compile("\\d[\\d,\\.]+");
Matcher finder = regex.matcher(input);
if( finder.find() )  // or while() if you want to process each
  try 
    double value = Double.parseDouble(finder.group(0).replaceAll(",", ""));
    // do something with value
   catch (NumberFormatException e ) 
    // handle unparseable
  

【讨论】:

我被困在公共汽车上@Jake 看起来很有希望,我将尝试将价格范围设为 500 或 50,000 或 50,000,000【参考方案2】:

您可以将任何String 分别转换为intdoubleInteger.parseInt(\\String you want to convert)Double.parseDouble(\\String you want to convert)

在您的第一种和第二种情况下,这将为您提供50000。 在第三个 cae 中,您需要先将字符串拆分为 2,然后重复此技巧。

您的标题有点误导,因为您没有询问如何从英镑转换为欧元。

【讨论】:

【参考方案3】:

使用正则表达式删除不重要的字符,然后将结果解析为双精度。如果您只关心美元价值,则可以将其截断为 int。

NumberFormat format = NumberFormat.getInstance();
format.parse(priceNumber.replaceAll("[^\\d]*([\\d,]*).*", "$1")).doubleValue()

替换模式的第一部分[^\\d] 匹配并丢弃前导字符,第二部分([\\d,]) 保存下一系列数字和逗号,然后第三部分.* 丢弃其余输入。

然后整个输入被第一个保存匹配的内容(替换模式的第二部分)替换。

然后你使用 NumberFormat 类来解析数字(如果不是逗号,你可以使用Double.parseDouble()

【讨论】:

【参考方案4】:

我认为这会起作用!

    String string = "This is £50,000 pounds, this is £5.00 pounds.";
    String newString = string;

    while (string.contains("£")) 

        if (string.indexOf("£") != -1) 
            // it contains £
            string = string.substring(string.indexOf("£"));
            newString = string.substring(0, string.indexOf(" "));

            string = string.replaceFirst(newString, "");

            newString = newString.replaceAll("£", "");
            newString = newString.replaceAll(",", "");

            double money = Double.parseDouble(newString);

            System.out.println(money);
        
    

【讨论】:

【参考方案5】:

你可以试试这个(适用于所有情况),

String priceNumber = "£500001   wcjnwknv122333- £55,000";
String regex = "£(\\d+,?\\d+)\\D?";

Pattern p =Pattern.compile(regex);
Matcher m = p.matcher(priceNumber);
if(m.find())
    System.out.println(m.group(1));
  

【讨论】:

【参考方案6】:

试试下面的正则表达式:

   ((\$|£)\d+\s|(\$|£)\d+-(\$|£)\d+\s)

【讨论】:

以上是关于Java中的货币解析的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的类不要使用$符的原因解析

Java中的货币转换器具有精度和浓缩问题

华为OD机试用java实现 -货币单位换算

Java 中的货币精度(不是 BigDecimal)

Java从字符串中获取数字或货币格式[关闭]

在 Java 中的外国语言环境中格式化货币