【问题标题】:GRPC clojure BigDecimal to java BigDecimalGRPC clojure BigDecimal 到 java BigDecimal
【发布时间】:2020-06-09 13:51:03
【问题描述】:

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

另一件事,我们的字段在我们的原型中被声明为一个字符串,即使它是一个大小数。

FLOW info: JAVA (big decimal to string) --> GRPC --> clojure (string to big decimal then processing and then big decmial back to string) --> GRPC --> Java (string to big decimal -这就是错误所在)

我们从 GRPC 字符串中获取的值的一个示例是 -840M。我们可以进行字符串替换,但这似乎很脆弱。有没有实用程序来处理这个问题?

谢谢, 布赖恩

【问题讨论】:

  • 请编辑您的问题以包含导致困难的末尾有字母的字符串示例。谢谢。
  • 我添加了更多信息,如果我需要澄清更多信息,请告诉我。

标签: java clojure grpc


【解决方案1】:

问题在于 Clojure 服务正在使用 Clojure 的本机打印机制将 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

【讨论】:

猜你喜欢
  • 2014-02-26
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多