準備參加九年九月份的PAT甲級證書考試,對網站上的題目進行總結分析:html
1001題 A+B Format (20 分)java
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).git
計算a+b的值並以必定格式輸出其和sum(數字須要以每三個數字爲一組來輸出,中間以逗號隔開)當sum低於四位數的時候不須要以逗號隔開編程
Each input file contains one test case. Each case contains a pair of integers a and b where −106≤a,b≤106. The numbers are separated by a space.segmentfault
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.api
-1000000 9
-999,991
代碼實現:oracle
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int a = in.nextInt(); int b = in.nextInt(); int sum; sum=a+b; if(Math.abs(sum)<1000) { System.out.println(sum); } else { System.out.format("%,d%n",sum); } } } }
運行截圖:less
問題分析:編程語言
簡單的數字相加問題,要拿到滿分的關鍵不在數字相加上,而在與如何按照題目中要求的格式輸出最後相加的數字,經過這個問題我也學到了一些東西,接下來進行總結:ide
當sum的絕對值小於1000時,正常輸出便可。
當sum的絕對值大於等於1000時,須要按格式輸出。在代碼中主要用到System.out.format()的方法,接下來對其進行介紹。
從下面兩個連接中學到了不少:https://segmentfault.com/a/1190000017828119
https://blog.csdn.net/u012246458/article/details/52634175
在前面的學習中咱們已經看到使用print
和println
方法將字符串打印到標準輸出(System.out
),因爲全部數字均可以轉換爲字符串,你可使用這些方法打印出任意的字符串和數字混合,可是,Java編程語言還有其餘方法,能夠在包含數字時對打印輸出進行更多控制。
java.io
包中包含一個PrintStream
類,它有兩種格式化方法可用於替換print
和println
,這些方法,format
和printf
,彼此相同。你一直使用的熟悉的System.out
剛好是PrintStream
對象,所以你能夠在System.out
上調用PrintStream
方法,所以,你能夠在之前使用print
或println
的代碼中的任何位置使用format
或printf
,例如:
System.out.format(.....);
格式說明符以百分號(%
)開頭,以轉換器結束,轉換器是一個字符,指示要格式化的參數類型,在百分號(%
)和轉換器之間,你可使用可選的標誌和說明符,java.util.Formatter中記錄了許多轉換器、標誌和說明符。
這是一個基本的例子:
int i = 461012; System.out.format("The value of i is: %d%n", i);
%d
指定單個變量是十進制整數,%n
是與平臺無關的換行符,輸出是:
The value of i is: 461012
下表列出了表格後面的示例程序TestFormat.java
中使用的一些轉換器和標誌。

如下程序顯示了你可使用格式進行的一些格式化,輸出顯示在嵌入註釋中的雙引號內:
TestFormat.java
import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n); // --> "461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06" } }
你可使用java.text.DecimalFormat類來控制前導和尾隨零、前綴和後綴、分組(千)分隔符和小數分隔符的顯示,DecimalFormat
在數字格式化方面提供了極大的靈活性,但它使你的代碼更復雜。
下面的示例經過將模式字符串傳遞給DecimalFormat
構造函數來建立DecimalFormat
對象myFormatter
。而後,myFormatter
會調用DecimalFormat
從NumberFormat
繼承的format()
方法 — 它接受double
值做爲參數,並返回字符串中的格式化數字:
這是一個示例程序,說明了DecimalFormat
的用法:
import java.text.*; public class DecimalFormatDemo { static public void customFormat(String pattern, double value ) { DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(value + " " + pattern + " " + output); } static public void main(String[] args) { customFormat("###,###.###", 123456.789); customFormat("###.##", 123456.789); customFormat("000000.000", 123.78); customFormat("$###,###.###", 12345.67); } }
輸出是:
123456.789 ###,###.### 123,456.789 123456.789 ###.## 123456.79 123.78 000000.000 000123.780 12345.67 $###,###.### $12,345.67
下表說明了每行輸出:
一些具體實例:
DecimalFormat format 方法 你們在format()一個小數是,老是對格式中的'0'和'#'有些不解吧! eg: 1:new DecimalFormat("00.000").format(pi) //結果:03.142 2:new DecimalFormat("##.###").format(pi) //結果:3.142 都是對pi進行格式化,但第一個的結果是03.142,第二個的結果是3.142 這是什麼緣由呢? 0和#都是佔位符,但在不一樣的地方,做用不同。下面對他們作了具體的比較。 但願對你們有所幫助。 0: 比實際數字的位數多,不足的地方用0補上。 new DecimalFormat("00.00").format(3.14) //結果:03.14 new DecimalFormat("0.000").format(3.14) //結果: 3.140 new DecimalFormat("00.000").format(3.14) //結果:03.140 比實際數字的位數少:整數部分不改動,小數部分,四捨五入 new DecimalFormat("0.000").format(13.146) //結果:13.146 new DecimalFormat("00.00").format(13.146) //結果:13.15 new DecimalFormat("0.00").format(13.146) //結果:13.15 #: 比實際數字的位數多,不變。 new DecimalFormat("##.##").format(3.14) //結果:3.14 new DecimalFormat("#.###").format(3.14) //結果: 3.14 new DecimalFormat("##.###").format(3.14) //結果:3.14 比實際數字的位數少:整數部分不改動,小數部分,四捨五入 new DecimalFormat("#.###").format(13.146) //結果:13.146 new DecimalFormat("##.##").format(13.146) //結果:13.15 new DecimalFormat("#.##").format(13.146) //結果:13.15
其餘的一些用法,(添加百分號,千分號,科學計數法,自定義正負數模板)
可參照
http://jff.iteye.com/blog/576737
http://blog.csdn.net/marcoleung/article/details/176514
因爲1中的方法保留兩位小數,最後一位會四捨五入,因此用BigDecimal 來截取小數點後兩位
下面是相關的方法:
BigDecimal.setScale()方法用於格式化小數點 setScale(1)表示保留一位小數,默認用四捨五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4 setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,若是是5則向下舍 setScaler(1,BigDecimal.ROUND_CEILING)接近正無窮大的舍入 setScaler(1,BigDecimal.ROUND_FLOOR)接近負無窮大的舍入,數字>0和ROUND_UP做用同樣,數字<0和ROUND_DOWN做用同樣 setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。 註釋: 1:scale指的是你小數點後的位數。好比123.456則score就是3. score()就是BigDecimal類中的方法啊。 好比:BigDecimal b = new BigDecimal("123.456"); b.scale(),返回的就是3. 2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,有不少種。 好比:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。 3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 的意思是說:我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的,你能夠本身選! 4:對於通常add、subtract、multiply方法的小數位格式化以下: BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("mData=" + mData); ----結果:----- mData=9.66
END(之後如有相關知識會繼續補充)