使用 Moneta (JavaMoney) JSR 354 实现自定义货币金额格式

2024-03-18

我真的很困惑如何定制MonetaryAmountFormat使用 Moneta JSR-354 实现。

我的目的是能够解析两者1.23 and $3.45 as MonetaryAmounts.

这是我的单元测试:

@Test
public void testString() {
    Bid bid = new Bid("1.23");
    assertEquals(1.23, bid.getValue(), 0.0);
    System.out.println(bid);

    bid = new Bid("$3.45");
    assertEquals(3.45, bid.getValue(), 0.0);
    System.out.println(bid);
}

这是我的课程:

public final class Bid {

    private static final CurrencyUnit USD = Monetary.getCurrency("USD");
    private MonetaryAmount bid;

    /**
     * Constructor.
     *
     * @param bidStr the bid
     */
    public Bid(String bidStr) {
        MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
                AmountFormatQueryBuilder.of(Locale.US)
                .set("pattern", "###.##")
                .build());
        if (StringUtils.isNotBlank(bidStr)) {
            bidStr = bidStr.trim();
            bidStr = bidStr.startsWith("$") ? bidStr.substring(1) : bidStr;
            try {
                bid = FastMoney.parse(bidStr, format);
            } catch (NumberFormatException e) {
                bid = FastMoney.of(0, USD);
            }
        }
    }

    /**
     * Constructor.
     *
     * @param bidDouble the bid
     */
    public Bid(double bidDouble) {
        bid = FastMoney.of(bidDouble, USD);
    }

    public double getValue() {
        return bid.getNumber().doubleValue();
    }
}

我真的很希望能够解析bidStr有或没有$使用单MonetaryAmountFormat,但是在花了很多时间试图找出如何制作之后$可选,我放弃了。不幸的是,我什至不知道如何制作1.23被解析为美元。莫内塔抛出了一个NullPointerException。我应该使用设置货币吗AmountFormatQueryBuilder?可以使用哪些键进行设置AmountFormatQueryBuilder?我搜索了文档,但除了几个常用键之外找不到任何文档,例如pattern.


当尝试解析不合格的数字(例如1.23).

默认情况下,MonetaryAmountFormat希望您提供货币名称(例如USD 1.23):

MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.US);
MonetaryAmount amount = format.parse("USD 1.23");

如果你设置CurrencyStyle.SYMBOL,那么您可以按货币名称或符号进行解析(因此,USD 1.23 or $3.45):

AmountFormatQuery formatQuery = AmountFormatQueryBuilder.of(Locale.US)
    .set(CurrencyStyle.SYMBOL)
    .build();
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(formatQuery);
MonetaryAmount amount1 = format.parse("USD 1.23");
MonetaryAmount amount2 = format.parse("$3.45");

这可能是您使用 JavaMoney 所能得到的最接近的结果。

如果您知道您只能从相同的货币获取数字,那么您最好在其他地方解析字符串(使用正则表达式或其他东西)并转换为一致的输入格式,因为(正如您发现的),您可以轻松获得NullPointerException当 JavaMoney 不高兴时,没有任何解释。

至于可用的键,您可以查看以下常量org.javamoney.moneta.format.AmountFormatParams: pattern, groupingSizes, groupingSeparators.

设置格式时,需要注意的是,必须使用通用的货币符号 https://en.wikipedia.org/wiki/Currency_sign_%28typography%29: ¤。例如,你可能会这样做.set("pattern", "¤#,##0.00").

最后,而不是直接使用FastMoney来自 Moneta RI 的类,您可以直接从MonetaryAmountFormat:

// rather than using Monata directly:
MonetaryAmount amount = FastMoney.parse(bidStr, format);

// use the API:
MonetaryAmount amount = format.parse(bidStr);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Moneta (JavaMoney) JSR 354 实现自定义货币金额格式 的相关文章

  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • 使用 Pyside + Python 中的类进行样式设计

    如何使用类更好地设计该应用程序的样式 而不是为每个看起来相同的标签重新定义相同的样式 更改样式变得很痛苦 因为我必须仔细检查每个看起来相同的标签并粘贴代码以进行匹配 usr bin python coding utf 8 import sy
  • Cordova CLI,使用 Git,并保存插件/平台

    我正在尝试找出如何将一些 Cordova git 最佳实践 与我认为的现实相协调 我希望有人能为我阐明这一点 如果我理解正确的话 当前的 最佳实践 是将这些目录添加到我的 gitignore 来自 使用 Cordova CLI 进行开发 一
  • 有人可以解释一下 xml:base 属性在 XHTML5 中的用途吗?

    我想知道 xml base 属性的作用是什么以及它在 XHTML5 中的值是什么 xml base 属性有什么限制吗 文档为xml base可以被找寻到here http www w3 org TR xmlbase syntax 它允许重新
  • 在 Java 中将列表迭代器传递给多个线程

    我有一个包含大约 200K 元素的列表 我是否能够将此列表的迭代器传递给多个线程 并让它们迭代整个列表 而没有任何一个线程访问相同的元素 这就是我此刻的想法 Main public static void main String args
  • Statsmodels Poisson glm 与 R 不同

    我正在尝试根据 R 中提供的一些代码来拟合一些模型 空间交互模型 我已经能够在 python 框架中使用 statsmodels 使一些代码正常工作 但其中一些代码根本不匹配 我相信我的 R 和 Python 代码应该给出相同的结果 有人看
  • 非模板化成员函数的enable_if用法[重复]

    这个问题在这里已经有答案了 C 程序设计语言 第四版 一书 第28 4章 第796页 解释了enable if并给出了使operator gt 成为条件定义的示例 书中的例子只是一个代码片段 我将其完成为程序如下 include
  • lua __pairs 的实际实现是什么?

    有谁知道 lua 5 2 的实际实现吗 元方法 pairs 换句话说 我如何实施 pairs作为元表中的元方法 因此它的工作原理与pairs 我需要覆盖 pairs并想跳过我在表中添加的一些虚拟变量 下面将使用元表元来显式提供pairs默认
  • 更改数组适配器中列表项的文本颜色

    我创建一个列表视图并在自定义对话框中实现该列表视图 该列表视图使用数组适配器 在我的数组适配器中 我使用自己的布局和所需的颜色 代码如下 listView new ListView context ArrayAdapter
  • PHP Printf 作为浮点精度

    我正在尝试使用 PHPprintf功能打印出用户的存储容量 完整的公式看起来像这样 echo printf 02f size 1024 1024 GB 鉴于 size 10 1024 1024 这应该打印出来 10 00 GB 但事实并非如
  • 读取 byte[] 历史队列

    我正在尝试编写一个我知道数组大小的字节数组 但是我无法解析结果数据 我正在使用以下代码 okAppender writeBytes b gt b write byteData and byte byteData new byte 500 o
  • 如何在phpmyadmin中导入大型sql文件

    我想导入一个大约 12 mb 的 sql 文件 但它在加载时引起问题 有没有办法在不分割sql文件的情况下上传它 尝试根据您的操作系统的口味从 mysql 控制台导入它 mysql u DB USER NAME p DB NAME lt d
  • Spring Boot:禁用特定 URL 的客户端身份验证

    我的配置中有以下配置application yml server address port 8443 sessionTimeout 30 ssl client auth need key store keyStore jks key sto
  • Xamarin iOS 通用链接支持 Twitter 身份验证

    所以 现在 Twitter 从 9 月 25 日开始支持通用链接 这意味着当 UIWebView 命中时https twitter com oauth authorize oauth token https twitter com oaut
  • 仅根据字段名称对类数组进行排序

    我有一个应用程序 用户向我提供字段名称 例如name or costInCents 我必须按该字段排序 我有办法保证字段名称是正确的 这个应用程序导致了我根本无法上课的复杂情况Comparable并实施具体的compareTo 因为自定义实
  • 为用户定义类型实现 ToOwned

    考虑以下示例代码 derive Clone struct DataRef lt a gt text a str derive Clone struct DataOwned text String 我要实施ToOwned for DataRe
  • 如何让 iPhone 应用程序用户提交崩溃报告? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone如何获取客户的崩溃日志 https stackoverflow com questions 3844482 iphone how to get crash log from custome
  • 在 JavaScript 中,当完成通过 new ActiveXObject 创建的对象后,我是否需要将其设置为 null?

    在 WSH 中运行并创建对象 例如 Scripting FileSystemObject 或任何任意 COM 对象 的 Javascript 程序中 完成后是否需要将变量设置为 null 例如 我建议这样做 var fso new Acti
  • 如何将开始按钮放在剪辑的中间

    我在以下位置找到了设计师页面http www videojs com http www videojs com 在那里 您可以将开始按钮的位置更改为剪辑的中间 但我无法在 video js 播放器上放置或使用此样式表 有人可以解释一下如何在
  • C++ 中获取用户输入未执行/跳过的代码

    在下面的代码中 当我尝试让用户输入他们的名字时遇到错误 我的程序只是跳过它并直接进行函数调用 而不允许用户输入他们的名字 尽管出现错误 我的程序仍在编译 我不确定出了什么问题 因为我是根据在这里找到的其他示例编写该部分的 有什么建议么 in
  • 使用 Moneta (JavaMoney) JSR 354 实现自定义货币金额格式

    我真的很困惑如何定制MonetaryAmountFormat使用 Moneta JSR 354 实现 我的目的是能够解析两者1 23 and 3 45 as MonetaryAmounts 这是我的单元测试 Test public void