如何创建注解以格式化金额值

uqjltbpv  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(363)

所以我现在正在研究一个解决方案,其中我们有两个要求:
将ssn/电话号码格式化为连字符形式,否则当前显示时不带连字符。
将金额字段的格式设置为“$0.00”。
目前我们已经编写了一个formatashyphen和formatamount方法,如下所示:

/**
 * This method converts the given string into US format SSN / Telephone number
 * @param valueToFormat
 * @param fieldToFormat , It should be either 'S' for SSN and 'T' for Mobile Number
 * @return
 */
public String formatWithHyphen (String valueToFormat, String fieldToFormat) {
    if(valueToFormat != null && valueToFormat.length() > 1) {
        StringBuilder formattedValue = new StringBuilder(valueToFormat);
        if(fieldToFormat.equalsIgnoreCase("S")) {

            //format as SSN

            formattedValue = formattedValue.insert(3, '-').insert(6, '-');

        } else if(fieldToFormat.equalsIgnoreCase("T")) {

            //format as telephone number
            formattedValue = formattedValue.insert(3, '-').insert(7, '-');
        }

    return formattedValue.toString();
    }
    else {
        return null;
    }
}

/**
 * This method converts a given amount string to a US $ formatted amount.
 * 
 * @param amountToFormat
 * @return
 */
public String formatAmount(String amountToFormat) {

    try {
        if(amountToFormat!=null && amountToFormat.length() > 0) {
            Locale locale = new Locale("en", "US");
            NumberFormat formatter = NumberFormat.getCurrencyInstance(locale);
            return formatter.format(Double.parseDouble(amountToFormat));
        }
        else {
            return null;
        }

    } catch (NumberFormatException nfe) {
        nfe.printStackTrace();
    } catch (IllegalArgumentException iae) {
        iae.printStackTrace();
    }

    return null;

}

现在的问题是:
有多个pojo类(tempassist、suppnutrition、childcare等),其中包含与金额和ssn/电话号码相关的字段
当我们从数据库中获取这些字段时,首先在相应的setter中设置未格式化的数据,然后在ui层通过getter()获取值,并对其应用上述两个函数,最后以json格式响应客户端。
这不是一个干净的解决方案,因为set发生了两次,而且代码中包含get和set。
我要找的是:
注解(例如, @Format(type="ssn") 我可以在pojo字段上应用它,这将确保任何被注解的字段都将使用连字符更新ssn。
这是一个不使用spring框架的web应用程序,因此不能实现任何关于spring的建议。

gdx19jrr

gdx19jrr1#

创建一个扩展jsonserializer的类,然后在getter上使用@jsonserialize(using=myserializer.class)注解
其中一个序列化程序可能类似于:

public class MySerializer extends JsonSerializer<String> {

  @Override
  public void serialize( String value
                       , JsonGenerator jgen
                       , SerializerProvider provider) throws IOException
                                                           , JsonProcessingException {
    jgen.writeString(MyUtilsClass.formatWithHyphen(value) );
  }

}

相关问题