首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GRPC clojure BigDecimal到java BigDecimal

从GRPC clojure BigDecimal到java BigDecimal
EN

Stack Overflow用户
提问于 2020-06-09 13:51:03
回答 1查看 588关注 0票数 1

我有一个java客户端,它通过GRPC调用Clojure服务。问题是,当我们从他们的服务中得到回复时,它是在大小数点的末尾添加字母。当我们试图将它转换为java中的大小数点时,我们会得到一个错误,将字符串转换为大小数点。有什么想法吗?

另一件事是,我们的字段在proto中被声明为字符串,尽管它是一个大小数点。

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

我们试图在java中将GRPC字符串转换为BigDecmial的值的示例是-840米。我们可以做一个字符串替换,但这似乎很脆弱。有实用程序来处理这个问题吗?

谢谢你,布莱恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-09 15:31:38

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

代码语言:javascript
复制
(int 123)     => 123
(bigdec 123)  => 123M

原因是Clojure有用于BigDecimal和BigInteger的文字表单,您不需要进行显式构造函数调用就可以在代码中使用BigDecimal:

代码语言:javascript
复制
(type 12.3)   => java.lang.Double
(type 12.3M)  => java.math.BigDecimal

如果不能更改库以使用另一种字符串化方法-- BigDecimal值,则只需去掉最后一个字符M,然后解析该BigDecimal​(String val)构造函数或类似的方法即可。

可能最容易将其转换为char数组,然后使用以下构造函数:

代码语言:javascript
复制
BigDecimal​(char[] in, int offset, int len)

其中,len减少1,使其忽略尾随的M

代码语言:javascript
复制
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测试:

代码语言:javascript
复制
(dotest
  (let [parsed (BigDec/parseClojureString "12.3M")]
    (spyx parsed)
    (spyx (type parsed))))

有结果

代码语言:javascript
复制
parsed         => 12.3M
(type parsed)  => java.math.BigDecimal
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62284241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档