Java 使用Jackson将浮点格式化为定点
我已经搜索了Jackson文档,但是找不到任何关于浮点数的Java 使用Jackson将浮点格式化为定点,java,floating-point,jackson,number-formatting,Java,Floating Point,Jackson,Number Formatting,我已经搜索了Jackson文档,但是找不到任何关于浮点数的@JsonFormat的模式的好文档 给定一个字段 @JsonProperty("Cost") private Double cost; 如何让Jackson使用@JsonFormat将其格式化为十进制格式的四位数精度的定点数字 附言:我知道一个人不应该用花车来赚钱。请不要再讨论了。您需要为此创建自定义序列化程序。差不多 @JsonProperty("amountOfMoney") @JsonSerialize(using = My
@JsonFormat
的模式的好文档
给定一个字段
@JsonProperty("Cost")
private Double cost;
如何让Jackson使用@JsonFormat
将其格式化为十进制格式的四位数精度的定点数字
附言:我知道一个人不应该用花车来赚钱。请不要再讨论了。您需要为此创建自定义序列化程序。差不多
@JsonProperty("amountOfMoney")
@JsonSerialize(using = MySerializer.class)
private Double cost;
public class MySerializerextends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider provider) throws IOException,
JsonProcessingException {
double roundedValue = value*10000;
roundedValue = Math.round(roundedValue );
roundedValue = roundedValue /10000;
generator.writeNumber(roundedValue );
}
}
@JsonProperty(“amountOfMoney”)
@JsonSerialize(使用=MySerializer.class)
私人双重成本;
公共类mySerializer JsonSerializer{
@凌驾
public void serialize(双值、JsonGenerator生成器、SerializerProvider提供程序)引发IOException,
JsonProcessingException{
双舍入值=值*10000;
roundedValue=Math.round(roundedValue);
roundedValue=roundedValue/10000;
generator.writeNumber(舍入值);
}
}
你可以在这里看到这个班的情况
取整部分可能不是最好的。你可以随心所欲;)使用十进制格式也可以。如果使用WriteEnumber,它将在结果Json中将值打印为数字。这就是为什么我把答案从写字符串改为十进制格式
如果实现允许,您应该能够使用@JsonFormat模式
可使用的特定于数据类型的附加配置
进一步优化格式方面。例如,这可能决定
用于日期序列化的低级格式字符串;然而,确切地说
使用由特定的JsonSerializer决定
但对于jackson,我相信它只适用于日期。您需要为此创建自定义序列化程序。差不多
@JsonProperty("amountOfMoney")
@JsonSerialize(using = MySerializer.class)
private Double cost;
public class MySerializerextends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider provider) throws IOException,
JsonProcessingException {
double roundedValue = value*10000;
roundedValue = Math.round(roundedValue );
roundedValue = roundedValue /10000;
generator.writeNumber(roundedValue );
}
}
@JsonProperty(“amountOfMoney”)
@JsonSerialize(使用=MySerializer.class)
私人双重成本;
公共类mySerializer JsonSerializer{
@凌驾
public void serialize(双值、JsonGenerator生成器、SerializerProvider提供程序)引发IOException,
JsonProcessingException{
双舍入值=值*10000;
roundedValue=Math.round(roundedValue);
roundedValue=roundedValue/10000;
generator.writeNumber(舍入值);
}
}
你可以在这里看到这个班的情况
取整部分可能不是最好的。你可以随心所欲;)使用十进制格式也可以。如果使用WriteEnumber,它将在结果Json中将值打印为数字。这就是为什么我把答案从写字符串改为十进制格式
如果实现允许,您应该能够使用@JsonFormat模式
可使用的特定于数据类型的附加配置
进一步优化格式方面。例如,这可能决定
用于日期序列化的低级格式字符串;然而,确切地说
使用由特定的JsonSerializer决定
但对于杰克逊,我相信它只适用于约会。基于我使用的@Veselin的答案
public class DoubleDecimalSerializerWithSixDigitPrecisionAndDotSeparator
extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider serializers)
throws IOException {
generator.writeNumber(String.format(Locale.US, "%.6f", value));
}
}
具有六位精度和点分隔符的公共类DoubleDecimalSerializer
扩展JsonSerializer{
@凌驾
公共void序列化(双值、JsonGenerator生成器、SerializerProvider序列化器)
抛出IOException{
writeNumber(String.format(Locale.US,“%.6f”,value));
}
}
使用案例是在德国生成CSV,因此我不喜欢JSON格式,希望使用“.”作为十进制分隔符。基于我使用的@Veselin的答案
public class DoubleDecimalSerializerWithSixDigitPrecisionAndDotSeparator
extends JsonSerializer<Double> {
@Override
public void serialize(Double value, JsonGenerator generator, SerializerProvider serializers)
throws IOException {
generator.writeNumber(String.format(Locale.US, "%.6f", value));
}
}
具有六位精度和点分隔符的公共类DoubleDecimalSerializer
扩展JsonSerializer{
@凌驾
公共void序列化(双值、JsonGenerator生成器、SerializerProvider序列化器)
抛出IOException{
writeNumber(String.format(Locale.US,“%.6f”,value));
}
}
该用例是在德国生成CSV,因此我不关心JSON格式,希望使用“.”作为十进制分隔符。您可以在自定义序列化程序类中指定自己的格式设置程序
formatter = new DecimalFormat();
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setGroupingUsed(false);
DecimalFormatSymbols sym = DecimalFormatSymbols.getInstance();
sym.setDecimalSeparator('.');
formatter.setDecimalFormatSymbols(sym);
然后,在实际的序列化方法中:
final String output = formatter.format(value);
jsonGenerator.writeNumber(output);
您可以在自定义序列化程序类中指定自己的格式化程序
formatter = new DecimalFormat();
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setGroupingUsed(false);
DecimalFormatSymbols sym = DecimalFormatSymbols.getInstance();
sym.setDecimalSeparator('.');
formatter.setDecimalFormatSymbols(sym);
然后,在实际的序列化方法中:
final String output = formatter.format(value);
jsonGenerator.writeNumber(output);
pattern
在这里没有用?我相信对于jackson来说它只用于日期。pattern
在这里没有用?我相信对于jackson来说它只用于日期。