From bc46f8ca664e6095b62cf8f0451228235a336b47 Mon Sep 17 00:00:00 2001 From: gamax92 Date: Fri, 11 Jul 2014 14:54:29 -0600 Subject: [PATCH] Add more precision support to format Add precision support to e,E,f Add alternateForm support for e,E,f,g,G --- src/main/java/org/luaj/vm3/lib/StringLib.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/luaj/vm3/lib/StringLib.java b/src/main/java/org/luaj/vm3/lib/StringLib.java index e19db9411..9af098fc7 100644 --- a/src/main/java/org/luaj/vm3/lib/StringLib.java +++ b/src/main/java/org/luaj/vm3/lib/StringLib.java @@ -353,13 +353,7 @@ public class StringLib extends TwoArgFunction { public final int conversion; public final int length; - private DecimalFormat scientificFormat; - private DecimalFormat floatingFormat; - public FormatDesc(Varargs args, LuaString strfrmt, final int start) { - // TODO: force positive sign - scientificFormat = new DecimalFormat("0.000000E00"); - floatingFormat = new DecimalFormat("0.000000"); int p = start, n = strfrmt.length(); int c = 0; @@ -514,13 +508,18 @@ public class StringLib extends TwoArgFunction { } public void format(Buffer buf, double number) { - // TODO: precision, alternateForm + // TODO: force positive sign + + int precise = precision == -1 ? 6 : precision; + String addDot = alternateForm || precise > 0 ? "." : ""; + + DecimalFormat scientificFormat = new DecimalFormat("0" + addDot + new String(new char[precise]).replace("\0", "0") + "E00"); + DecimalFormat floatingFormat = new DecimalFormat("0" + addDot + new String(new char[precise]).replace("\0", "0")); + String digits; switch ( conversion ) { case 'e': - digits = scientificFormat.format( number ).toLowerCase(); - break; case 'E': digits = scientificFormat.format( number ); break; @@ -530,11 +529,15 @@ public class StringLib extends TwoArgFunction { case 'g': case 'G': default: - //TODO: g, G + // TODO: g, G + // TODO: precision digits = String.valueOf( number ); break; } + if ( conversion == 'e' || conversion == 'g' ) + digits = digits.toLowerCase(); + int minwidth = digits.length(); int ndigits = minwidth; int nzeros;