【问题标题】:Regarding Java String dollar to cents conversion关于 Java String 美元到美分的转换
【发布时间】:2010-03-09 05:29:07
【问题描述】:

我有一个 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" 输出 val= 520 美分

String dollval = "5.20" 输出值 =520 美分

【问题讨论】:

  • 也忘了在我之前的帖子中提到。当我处理像“-0.09”这样的值时,当我移动到美元整数时,符号会丢失。美元的值为 0,美分的值为 9
  • @arav:你也可以编辑自己的问题来澄清事情。

标签: java string


【解决方案1】:

我绝对不会用正则表达式来做这件事,因为这会导致不必要的复杂和容易出错的代码。 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 美分

我的代码假定这是一个错误,并且您的意思是没有小数部分的数字被解释为正数和负数的完整美元。

【讨论】:

  • 同意增加的复杂性是增加维护。曾经和我一起工作的一位工程师总结得非常好。当您无法向其添加更多内容时,设计就没有完成;当您无法拿走任何东西时,设计就完成了。将其简化为最基本的要素,并使其尽可能坚固耐用。与其说是让我的座右铭崩溃的花式 GUI,不如说是一个始终如一地工作的绿屏应用程序。是的,它可能是老式的,但至少这可以保证交货。
【解决方案2】:

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

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");
}

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

【讨论】:

  • 非常感谢您的宝贵时间。我错过了用户的以下输入类型。非常感谢您让我知道“虽然您可以将“99”定义为 99 美分,将“99.0”定义为 9900 美分,但如果用户输入“99.1”或“99.10”,这可能会让用户感到困惑,那么它应该为 9910 美分。我之前发布的输出中也存在拼写错误。我现在正在编辑它
【解决方案3】:

这是一个很好的家庭作业问题。尝试对小数进行标记(或拆分)。第一个代币会给你你的全部美元。第二部分,硬币。如果小数点后只有 1 个字符,则乘以 10,使 12.3 变为 12 * 100 + 3 * 10,而不仅仅是 3。如果超过 2 个标记,则出错。

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

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2015-08-23
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多