gpt4 book ai didi

java - GRPC clojure BigDecimal 到 java BigDecimal

转载 作者:行者123 更新时间:2023-12-01 16:20:55 32 4
gpt4 key购买 nike

我有一个 java 客户端,它通过 GRPC 调用 Clojure 服务。问题是,当我们从他们的服务收到响应时,它会在大十进制的末尾添加字母。当我们尝试在 java 中将其转换为大十进制时,我们会收到从字符串转换为大十进制的错误。有什么想法吗?

另一件事,我们的字段在原型(prototype)中被声明为字符串,即使它是一个大十进制。

流程信息:JAVA(大十进制到字符串)--> GRPC --> clojure(字符串到大十进制然后处理,然后大十进制返回字符串)--> GRPC --> Java(字符串到大十进制 -这就是错误所在)

我们从 GRPC 字符串返回的值的一个示例是 -840M,我们试图将其转换为 java 中的 BigDecmial。我们可以进行字符串替换,但这似乎很脆弱。有没有实用程序可以处理这个问题?

谢谢,布赖恩

最佳答案

问题在于 Clojure 服务正在使用 Clojure 的 native 打印机制将 BigDecimal 值转换为字符串。当使用 printlnprn 时,这会将后缀 M 添加到所有 BigDecimal 值(BigInteger 值获得 N 后缀) :

(int 123)     => 123
(bigdec 123) => 123M

原因是 Clojure 具有 BigDecimal 和 BigInteger 的文字形式,您无需进行显式构造函数调用即可在代码中使用 BigDecimal:

(type 12.3)   => java.lang.Double
(type 12.3M) => java.math.BigDecimal

如果您无法更改库以使用另一种字符串化 BigDecimal 值的方法,则可以安全地删除最后一个字符 M,然后解析该 BigDecimal​( String val) 构造函数或类似的。

转换为 char 数组可能是最简单的方法,然后使用此构造函数:

BigDecimal​(char[] in, int offset, int len)

其中 len 减 1 以使其忽略尾随的 M:

package demo;
import java.math.BigDecimal;

public class BigDec {
public static BigDecimal parseClojureString(String str ) {
char[] chars = str.toCharArray();
return new BigDecimal(chars, 0, (chars.length - 1));
}
}

和 Clojure 测试:

(dotest
(let [parsed (BigDec/parseClojureString "12.3M")]
(spyx parsed)
(spyx (type parsed))))

结果

parsed         => 12.3M
(type parsed) => java.math.BigDecimal

关于java - GRPC clojure BigDecimal 到 java BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62284241/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com