Java 使用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

我已经搜索了Jackson文档,但是找不到任何关于浮点数的
@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来说它只用于日期。