package com.hdkj.lt.base.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 *
 * @author luorui
 * @date 2025/7/8 9:21
 * @discription
 *
 **/
public class StringFormatSerializer {


    /**
     *
     * 将科学计数法的字符串，转换成四舍五入保留2位的形式
     * 1.可能为 null
     * 2.可能是NaN
     * 3.浮点型小数
     * 4.科学计数法
     * 5.要求四舍五入保留2位小数
     */
    public static class Keep2StringSerializer extends JsonSerializer<String> {
        @Override
        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
            //1.可能为 null
            if (value == null || value.trim().isEmpty() || "null".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            //2.可能是NaN
            if ("NaN".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            //3.浮点型小数 4.科学计数法
            try {
                BigDecimal bd = new BigDecimal(value.trim());
                //5要求四舍五入保留2位小数
                String formatted = bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
                generator.writeString(formatted);
            } catch (Exception e) {
                generator.writeNull();
            }
        }

    }

    /**
     *
     * 将科学计数法的字符串，转换成四舍五入保留2位的形式
     * 1.可能为 null
     * 2.可能是NaN
     * 3.浮点型小数
     * 4.科学计数法
     * 5.要求四舍五入保留3位小数
     */
    public static class Keep3StringSerializer extends JsonSerializer<String> {
        @Override
        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
            //1.可能为 null
            if (value == null || value.trim().isEmpty() || "null".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            //2.可能是NaN
            if ("NaN".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            //3.浮点型小数 4.科学计数法
            try {
                BigDecimal bd = new BigDecimal(value.trim());
                //5要求四舍五入保留2位小数
                String formatted = bd.setScale(3, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
                generator.writeString(formatted);
            } catch (Exception e) {
                generator.writeNull();
            }
        }

    }


    /**
     *
     * 对字符串格式
     * 1.可能为 null
     * 2.可能是NaN
     */
    public static class NaNStringSerializer extends JsonSerializer<String> {
        @Override
        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
            //1.可能为 null
            if (value == null || value.trim().isEmpty() || "null".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            //2.可能是NaN
            if ("NaN".equalsIgnoreCase(value.trim())) {
                generator.writeNull();
                return;
            }
            generator.writeString(value);
        }

    }

}
