我有一个 java 客户端,它通过 GRPC 调用 Clojure 服务。问题是,当我们从他们的服务收到响应时,它会在大十进制的末尾添加字母。当我们尝试在 java 中将其转换为大十进制时,我们会收到从字符串转换为大十进制的错误。有什么想法吗?
另一件事,我们的字段在原型(prototype)中被声明为字符串,即使它是一个大十进制。
流程信息:JAVA(大十进制到字符串)--> GRPC --> clojure(字符串到大十进制然后处理,然后大十进制返回字符串)--> GRPC --> Java(字符串到大十进制 -这就是错误所在)
我们从 GRPC 字符串返回的值的一个示例是 -840M,我们试图将其转换为 java 中的 BigDecmial。我们可以进行字符串替换,但这似乎很脆弱。有没有实用程序可以处理这个问题?
谢谢, 布赖恩
最佳答案
问题在于 Clojure 服务正在使用 Clojure 的 native 打印机制将 BigDecimal 值转换为字符串。当使用 println
或 prn
时,这会将后缀 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/