我有一个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美分
答案 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,但是你可能会遇到一些舍入问题。最好留在整数土地上。