关于Java String美元到美分的转换

时间:2010-03-09 05:29:07

标签: java string

我有一个java字符串,它在小数点后面有一个美元值和美分值,以+或 - 符号开头。我想转换成美分并将其存储在整数中(它可以有+或 - )。此外,我需要检查美分部分(小数点后)是否不超过2位数,如果存在则抛出错误信息

示例: String dollval =“12.23”输出值= 1223美分

String dollval =“12”输出值= 1200美分

String dollval =“ - 0.09”输出值= -9美分

String dollval =“” - 99“输出值= -99美分

String dollval =“ - 99.0”输出值= -99美分

String dollval =“ - 99.23”输出值= -9923美分

String dollval =“0.00”输出值= 0美分

String dollval =“5.2”输出值= 520美分

String dollval =“5.20”输出值= 520美分

3 个答案:

答案 0 :(得分:4)

我肯定使用regexp执行此操作,因为这会导致不必要的复杂且容易出错的代码。 Java标准API提供了一个非常简单的解决方案:

    BigDecimal dollars = new BigDecimal(inputString);
    if(dollars.scale()>2)
    {
        throw new IllegalArgumentException();
    }
    int cents = dollars.multiply(new BigDecimal(100)).intValue();

请注意,您的上述要求并不一致:

  

String dollval =“12”输出值= 1200美分

     

String dollval =“” - 99“输出值= -99美分

我的代码假设这是一个错误,你的意思是没有小数部分的数字被解释为正数和负数的全数。

答案 1 :(得分:1)

您的示例仍存在重大问题。

  

String dollval =“12”输出值= 1200美分

     

String dollval =“ - 99”输出值= -99美分

因此,如果一个数字是正数,那么它是美元,如果它是负数则是美分?这是不合逻辑的。

  

String dollval =“ - 99.0”输出值= -99美分

     

String dollval =“ - 99.23”输出值= -9923美分

'。'之后的数字是什么?实际上意味着在第一个例子中,它们似乎意味着分数的一小部分。在第二个,它们意味着一美元的一小部分。这是不合逻辑的。


话虽如此,我将使用正则表达式将输入分成几部分,将部分转换为整数,然后根据示例中推断的含义重新组合它们。像这样:

int cents;
Matcher m = Pattern.compile("([-+]?)([0-9]+)(?:\.([0-9]{0,2}))").matcher(input);
if (m.matches()) {
    int sign = m.group(0).equals("-") ? -1 : 1;
    cents = Integer.parseInt(m.group(1));
    if (m.groupCount() == 3) {
        // I'm assuming that "99.1" should mean 9910 cents ...
        int tmp = (m.group(2).length() == 0) ? 0 :
               (m.group(2).length() == 1) ? (Integer.parseInt(m.group(2)) * 10) :
               Integer.parseInt(m.group(2));
        cents = cents * 100 + tmp;
    }
    cents = cents * sign;
} else {
    throw new SomeException("invalid dollars/cents value");
}

警告:此代码甚至可能无法编译,更不用说按预期工作了。当然,实施取决于要求的各个方面......我仍然认为这是错误的。

答案 2 :(得分:0)

这是一个很好的家庭作业问题。尝试对小数进行标记(或拆分)。第一个代币将为您提供全部资金。第二部分,便士。如果小数点后只有1个字符,则乘以10使12.3变为12 * 100 + 3 * 10,而不仅仅是3.如果超过2个令牌,则错误。

你也可以做(int)Float.parseFloat(string)* 100,但是你可能会遇到一些舍入问题。最好留在整数土地上。