如何在Java中将formatter设置为变量?

如何在Java中将formatter设置为变量?,java,android,format,Java,Android,Format,我想根据另一个变量double“I”中存储的数字,在Java中格式化双变量。假设i=3,那么我想要格式化 decimals_text = String.format("%."+String.valueOf(3)+"f", 2.123); 如果i=5,则 decimals_text = String.format("%."+String.valueOf(5)+"f", 2.123); 问题是,如果我使用而不是String.valueOf(3)String.valueOf(I),则会出现以下错误

我想根据另一个变量double“I”中存储的数字,在Java中格式化双变量。假设i=3,那么我想要格式化

decimals_text = String.format("%."+String.valueOf(3)+"f", 2.123);
如果i=5,则

decimals_text = String.format("%."+String.valueOf(5)+"f", 2.123);
问题是,如果我使用而不是String.valueOf(3)String.valueOf(I),则会出现以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rpncalculator, PID: 376
java.lang.RuntimeException: Unable to start activity   ComponentInfo{com.example.rpncalculator/com.example.rpncalculator.MainActivity}:   java.util.UnknownFormatConversionException: Conversion = '.'
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.util.UnknownFormatConversionException: Conversion = '.'
    at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2781)
    at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2811)
    at java.util.Formatter$FormatSpecifierParser.<init>(Formatter.java:2624)
    at java.util.Formatter.parse(Formatter.java:2557)
    at java.util.Formatter.format(Formatter.java:2504)
    at java.util.Formatter.format(Formatter.java:2458)
    at java.lang.String.format(String.java:2770)
    at com.example.rpncalculator.MainActivity.onCreate(MainActivity.java:134)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
E/AndroidRuntime:致命异常:主
进程:com.example.rpncalculator,PID:376
java.lang.RuntimeException:无法启动活动组件信息{com.example.rpncalculator/com.example.rpncalculator.MainActivity}:java.util.UnknownFormatConversionException:Conversion='.'
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)上
位于android.os.Handler.dispatchMessage(Handler.java:106)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6494)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
原因:java.util.UnknownFormatConversionException:Conversion='
在java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2781)
位于java.util.Formatter$FormattSpecifier。(Formatter.java:2811)
位于java.util.Formatter$FormatSpecifierParser。(Formatter.java:2624)
位于java.util.Formatter.parse(Formatter.java:2557)
位于java.util.Formatter.format(Formatter.java:2504)
位于java.util.Formatter.format(Formatter.java:2458)
位于java.lang.String.format(String.java:2770)
位于com.example.rpncalculator.MainActivity.onCreate(MainActivity.java:134)
位于android.app.Activity.performCreate(Activity.java:7009)
位于android.app.Activity.performCreate(Activity.java:7000)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)上
位于android.os.Handler.dispatchMessage(Handler.java:106)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6494)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

如何解决这个问题?

您可以使用BigDecimal

BigDecimal bd = new BigDecimal("2.133");
int roundTo = 2;

bd = bd.setScale(roundTo, RoundingMode.HALF_EVEN);
System.out.println(bd);

您可以使用BigDecimal

BigDecimal bd = new BigDecimal("2.133");
int roundTo = 2;

bd = bd.setScale(roundTo, RoundingMode.HALF_EVEN);
System.out.println(bd);

之所以会出现错误,是因为您在本应给出
int
时给出了
double

您应该先将
double
四舍五入以转换为
int
。例如,您可以使用
Math.round

您可以先构建格式(使用
String.format
),然后使用该格式获取字符串

double i = 3f;
String decimals_format = String.format("%%.%df", Math.round(i)); //for i=3 should give "%.3f"
String decimals_text = String.format(decimals_format, 2.123);
System.out.println(decimals_text);

之所以会出现错误,是因为您在本应给出
int
时给出了
double

您应该先将
double
四舍五入以转换为
int
。例如,您可以使用
Math.round

您可以先构建格式(使用
String.format
),然后使用该格式获取字符串

double i = 3f;
String decimals_format = String.format("%%.%df", Math.round(i)); //for i=3 should give "%.3f"
String decimals_text = String.format(decimals_format, 2.123);
System.out.println(decimals_text);
可能的重复可能的重复