我有一个java客户端,它通过GRPC调用Clojure服务。问题是,当我们从他们的服务中得到回复时,它是在大小数点的末尾添加字母。当我们试图将它转换为java中的大小数点时,我们会得到一个错误,将字符串转换为大小数点。有什么想法吗?
另一件事是,我们的字段在proto中被声明为字符串,尽管它是一个大小数点。
流信息: JAVA (大小数到字符串) --> GRPC -> clojure (字符串到大十进制,然后处理,然后大十进制返回到字符串) --> GRPC -> Java (字符串到大十进制--这就是错误所在)
我们试图在java中将GRPC字符串转换为BigDecmial的值的示例是-840米。我们可以做一个字符串替换,但这似乎很脆弱。有实用程序来处理这个问题吗?
谢谢你,布莱恩
发布于 2020-06-09 15:31:38
问题在于,Clojure服务使用Clojure的本机打印机制将BigDecimal值转换为字符串。这会在使用M或prn时将后缀BigDecimal添加到所有prn值(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.BigDecimalhttps://stackoverflow.com/questions/62284241
复制相似问题