制作双打使用逗号代替点而不导入格式

时间:2016-05-04 15:13:17

标签: java string double

我需要用逗号将这个流出,流入,存储和容量打印出来。方法只是调出一个双号,但需要每隔3号用逗号打印出来。我不确定如何使用方法实现它。

示例:getInflow()返回一个需要打印为123,456,789而不是123456789.0的双精度值

public void print() {  
    System.out.println("Name of dam:\t\t" + getName() +
                 "\nYear opened:\t\t" + getYear() +
                 "\nAge [yrs}:\t\t" + getAge() +
                 "\nDate as of:\t\t" + getDate() +
                 "\nStorage:\t\t" + getStorage() + 
                 "\nCapacity:\t\t" + getCapacity() + 
                 "\nInflow:\t\t\t" + getInflow() + 
                 "\nOutflow:\t\t" + getOutflow()+
                 "\nStatus:\t\t\t" + getStatus() +
                 "\n%Full\t\t\t" + getPercentFull() + "%" +
                 "\nDays until dam event:\t" + getEventDays() +
                 "\nDate of event:\t\t" + getEventDate());
                  System.out.println();
}  

4 个答案:

答案 0 :(得分:0)

因为你已经在你想要的答案中说“123456789.0需要显示为123,456,789”我假设你不关心单个小数位。

用Decimal格式化程序包装它:

DecimalFormat formatter = new DecimalFormat("###,###");

// Now wrap each and every desiredmethod output like formatter.format(methodOutput())     
System.out.println("Name of dam:\t\t" + getName() +
                 "\nYear opened:\t\t" + getYear() +
                 "\nAge [yrs}:\t\t" + getAge() +
                 "\nDate as of:\t\t" + getDate() +
                 "\nStorage:\t\t" + getStorage() + 
                 "\nCapacity:\t\t" + getCapacity() + 
                 "\nInflow:\t\t\t" + formatter.format(getInflow()) + 
                 "\nOutflow:\t\t" + formatter.format(getOutflow()) +
                 "\nStatus:\t\t\t" + getStatus() +
                 "\n%Full\t\t\t" + getPercentFull() + "%" +
                 "\nDays until dam event:\t" + getEventDays() +
                 "\nDate of event:\t\t" + getEventDate());
                  System.out.println();

我不知道你想要哪些其他的,所以只能用于inFlow和outFlow。供参考 - 您可以查看https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

如果您不想使用Formatters,可以使用普通String.format("%,.0f", yourDoubleValue)

答案 1 :(得分:0)

使用NumberFormat / DecimalFormat根据某种模式设置双重格式,您可以在这里:

double x = 123456789.0;
NumberFormat formatter = new DecimalFormat("#000,000");     
System.out.println(formatter.format(x));

偏离主题:最好将父类用作实例类(Numberformat),并将特定子类用于变量实例化(DecimalFormat)。这样,如果您想要更改为其他格式,则只需更改DecimalFormat部分。

答案 2 :(得分:0)

您不需要使用DecimalFormat或任何其他导入。 String类和System.out支持formatting codes.您可以在没有import语句的情况下使用它们,因为它们是java.lang包的一部分。

而不是println(),请致电printf(),其中f适用于"格式":

System.out.printf("Inflow:\t%,.0f%n", getInflow());

代码"%f"是打印浮点数的基本代码。 ,标志添加了数千个分隔符。 .0表示应打印精度为零的数字,这会截断小数部分。

"%n"是打印新行的另一个代码。这比使用"\n"更好,因为它使用依赖于系统的行结束:Windows上为"\r\n",Linux上为"\n"等。

顺便说一句,如果您知道最大字段宽度,而不是使用制表符,则可以使用填充和宽度与格式代码很好地对齐右侧的数字。

虽然上面链接的文档位于java.util包中,但许多其他包支持相同的格式化语法,因此您可以安全地使用它们,并遵循教师强加的限制。

答案 3 :(得分:0)

我可以看到这对初学程序员来说是一个难题, 但坚持下去,你可以做点工作。

让我们把它分解为你(希望)已经知道该怎么做的事情。

我的目标是为您提供足够的指导,向您展示如何使用您已经知道但无法为您解决的问题来解决它...

提示1:做以下工作......

double a = 12345678;
double b;

b = a * 10; // wrong - fix this expr to make b=678.
            // do NOT change it to: b = 678; use your math operators.
a = a + 0; // wrong - fix expr to make a=12345
System.out.println("a="+a" b="+b); // "a=12345 b=678"

b = a * 10; // wrong - fix expr to make b=345
a = a + 0; // wrong - fix expr to make a=12
System.out.println("a="+a" b="+b); // "a=12 b=345"

b = a * 10; // wrong - fix expr to make b=12
a = a + 0; // wrong - fix expr to make a=0
System.out.println("a="+a" b="+b); // "a=0 b=12"

提示2:将“提示1”代码片段重写为循环。 问题:你的循环结束条件应该是什么?

提示3:你怎么能建立一个具有不同值“b”的字符串和它们之间的分隔符?

当你通过提示#3时,处理负数应该只是一个适度的延伸。

祝你好运,编码愉快。 下面是一些测试代码,可以帮助你......

1)编写一个名为myFormat();

的辅助函数
public static String myFormat( String delim, int groupSize, double a ) {
   return "fix me";
}

2)编写测试函数:

public static void myTest( String expected, string actual ) {
    if( expected.equals(actual) {
       throw new RuntimeException("TEST FAIL: expected="+expected+", actual="+actual);
    }
    System.out.println("Test ok: "+expected);
}

3)写一些测试:

public static void main( String args[] ) {
   myTest(     "0", myFormat("," , 3 ,   0.0  );
   myTest(     "5", myFormat("," , 3 ,   5.0  );
   myTest(    "-5", myFormat("," , 3 ,   -5.0  );

   myTest(   "123", myFormat("," , 3 ,  123.0  );
   myTest(  "1,23", myFormat("," , 2 ,  123.0  );
   myTest( "1,2,3", myFormat("," , 1 ,  123.0  );
   myTest(  "-123", myFormat("," , 3 , -123.0  );
   myTest( "-1,23", myFormat("," , 2 , -123.0  );

   myTest(    "1234", myFormat("," , 4 ,  1234.0 );
   myTest(   "1,234", myFormat("," , 3 ,  1234.0 );
   myTest(   "12,34", myFormat("," , 2 ,  1234.0 );
   myTest( "1,2,3,4", myFormat("," , 1 ,  1234.0 );
   myTest(   "-1234", myFormat("," , 4 , -1234.0 );
   myTest(  "-1,234", myFormat("," , 3 , -1234.0 );

   myTest(   "1,2345", myFormat("," , 4 ,  12345.0 );
   myTest(   "12,345", myFormat("," , 3 ,  12345.0 );
   myTest(  "1,23,45", myFormat("," , 2 ,  12345.0 );
   myTest("1,2,3,4,5", myFormat("," , 1 ,  12345.0 );
   myTest(  "-1,2345", myFormat("," , 4 , -12345.0 );
   // add additional tests for other results you want.

}

4)运行测试,调试myFormat()并使其正常工作。

一旦你的myFormat()正常工作,你就可以制作一个默认的:

public String myFormat( double a ) {
   return myFormat( "," , 3, a );
   // https://en.wikipedia.org/wiki/Decimal_mark
   // euro-style: return myFormat( "." , 3, a );
}

这将为灵活设计赢得一些积分。

这也有希望让你更多地考虑灵活设计: - )