java - GRPC clojure BigDecimal 到 java BigDecimal

标签 java clojure grpc

我有一个 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/

相关文章:

java - 如何在 Java 中自动运行 GWT 编译?

java - 为什么这里忽略了这个 Java 运算符优先级?

java - 如何从音频中获取频率数组?

c++ - 针对 Bigtable 的 gRPC C++ 客户端调用偶尔会挂起

java - 有没有一种方法可以使用仅具有值的方法 insert 来插入树

functional-programming - 这段代码是如何工作的?

Clojure 返回 seq 中以 key 作为第一个元素的所有对的列表

ubuntu - 如何在 Ubuntu 11.10 和 Ubuntu 12.04 LTS 上安装 Clojure 1.5

protocol-buffers - 如何共享 gRPC 的 Protobuf 定义?

ios - 在 iOS 中本地存储 protobuf 对象