April 15, 2014

Formatting Numbers

ရှေ့တွင်ဖော်ပြခဲ့သော နမှုနာ ကုဒ်များတွင် အခြေခံ Output ဖြစ်သော System.out ၏ print နှင့် println တို့အား အသုံးပြုခဲ့ပြီး String နှင့် Primitive Type များအား String အနေဖြင့် Console ပေါ်တွင် ရိုက်ထုတ်နည်းအား အသုံးပြု ခဲ့ကြပါသည်။ Java Programming ဘာသာရပ်တွင် Number များအား ပို၍ ကြွယ်ဝသော ပုံစံများဖြင့် ဖော်ပြနိုင်ရန် အသုံးပြုနိုင်သော Method များ များစွာကျန်ရှိပါသေးသည်။


PrintStream Class


Java API ၏ java.io.PrintStream Class တွင် Format ပြုလုပ်၍ Standard Output ပြုလုပ်ရန် အတွက် format နှင့် printf method တို့အား ပြင်ဆင်ထားပါသည်။ ၎င်းတို့သည် အခြေခံအားဖြင့် Method ဖွဲ့စည်းပုံကော၊ လုပ်ဆောင် ပုံပါ အတူတူဖြစ်သည်။

System.out အား အသုံးပြုရာတွင် အတွင်းပိုင်း၌ java.io.PrintStream Object အား ခေါ်ယူအသုံးပြုနေသောကြောင့်၊ လက်တွေ့မှာမူ PrintStream Object အား ခေါ်ယူ၍သော်၎င်း၊ System.out မှသော်၎င်း ခေါ်ယူ၍ အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။

System.out PrintStream
System.out.ptint PrintStream.ptint
System.out.ptintln PrintStream.ptintln
System.out.format PrintStream.format
System.out.ptintf PrintStream.ptintf

အဆိုပါ Method များ၏ အသေးစိတ်ပုံစံမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။ printf တွင်လည်း အလားတူ အနေအထားအား ပိုင်ဆိုင်ပါသည်။
Method Description
PrintStream format( String format, Object … args) သတ်မှတ်ထားသော ပုံစံနှင့် ပုံစံချထားသော String အား Output Stream မှ နေ၍ ဖော်ပြနိုင်ရန် အသုံးဝင်သော Method ဖြစ်ပါသည်။
PrintStream format( Locale l, String format, Object … args) သတ်မှတ်ထားသော Locale နှင့် ပုံစံတို့အား အသုံးပြုကာ ပုံစံချထားသော String အား Output Stream မှ ဖော်ပြနိုင်ရန် အသုံးဝင်သော Method ဖြစ်ပါသည်။

အသုံးပြုပုံမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။
    public static void main(String[] args) {
        PrintStream ps = new PrintStream(System.out);
        ps.printf("My Name is %s.%n", "Min Lwin");
        ps.printf("I am %d years old", 39);  
     }
အထက်ပါကုဒ်များတွင် %s နေရာတွင် String အား အစားထိုးမည်ဖြစ်ပြီး၊ ဤနမှုနာတွင် “Min Lwin” အား အစားထိုးပါ မည်။ တဖန် %n သည် မျဉ်းတစ်ကြောင်းခြားရန် အမှတ်အသားဖြစ်ပြီး ပတ်ဝင်းကျင်အပေါ်မှုတည်ခြင်း မရှိပါ။ နောက်ဆုံးတွင် %d ၏ နေရာတွင် Decimal Integer အား အစားထိုးမည်ဖြစ်ပြီး၊ ဤနေရာတွင် 39 အား အစားထိုးပါမည်။ အထက်ပါ ပရိုဂရမ်အား Run ကြည့်သောအခါ အောက်ပါအတိုင်း အဖြေရရှိမည် ဖြစ်ပါသည်။
My Name is Minlwin
I am 39 years old
အဆိုပါ ပရိုဂရမ်အား System.out အား အသုံးပြု၍ ရေးသားမည်ဆိုပါက အောက်ပါအတိုင်း ရေးသားနိုင်ပါလိမ့်မည်။
    public static void main(String[] args) {
        System.out.printf("My Name is %s.%n", "Min Lwin");
        System.out.printf("I am %d years old", 39);  
     }
ရလဒ်မှာ အတူတူပင် ဖြစ်သည်။ format method အား အသုံးပြု၍ ရေးသားသည့်အခါတွင်လည်း အတူတူပင် ဖြစ်၏။


Converter and Flags for Formatting


Converter Flag Description
D A decimal Integer
F A float number
N မည်သည့် ပတ်ဝင်းကျင်မဆို လိုင်းအသစ် တစ်ကြောင်းကို ဖြည့်စွက် ပေးမည်ဖြစ်သည်။ \n အစား %n အား အသုံးပြုသင့်ပါသည်။
tB Date & Time Convertion Locale အပေါ်မှုတည်၍ လ၏အမည်အား အပြည့်အစုံ ဖော်ပြပေးပါမည်။
td, te Date & Time Convertion 2 digit date အား အသုံးပြုပါမည် td ဆိုပါက စာလုံးနှစ်လုံးမပြည့်သည့် နေ့များ၏ ရှေ့တွင် 0 အား ဖြည့်စွက်ပြီး၊ te ဆိုပါက 0 အား ဖြည့်စွက်မည်မဟုတ်ပါ။
ty, tY Date & Time Convertion ty အား အသုံးပြုပါက 2 digit year အားအသုံးပြုပြီး၊ tY အားအသုံးပြုပါက 4 digit year အား အသုံးပြုပါမည်။
tl Date & Time Convertion နာရီအား ၁၂နာရီစနစ်ဖြင့် ဖော်ပြပေးပါမည်။
tM Date & Time Convertion မိနစ်အား စာလုံးနှစ်လုံးဖြင့်ဖော်ပြပြီး၊ လိုအပ်ပါက 0 အား အစားထိုးဖော်ပြမည်။
tp Date & Time Convertion Locale အရ am/pm အား စာလုံးအသေးဖြင့် ဖော်ပြမည်။
tm Date & Time Convertion စာလုံးနှစ်လုံးဖြင့် လအားဖော်ပြီး၊ လိုအပ်ပါက 0 အား အစားထိုး ဖော်ပြပေးပါမည်။
tD Date & Time Convertion ရက်စွဲအား %tm%td%ty ဖြင့် ဖော်ပြပေးပါမည်။
08 စာလုံး ၈လုံးအား အသုံးပြု၍ လိုအပ်ပါက 0 အား ဖြည့်စွက်မည်
+ အပေါင်းအနှုတ်လက္ခဏာအား ဖြည့်စွက်ပေးမည်
, Locale အရ ကိန်းများအား အုပ်စုဖွဲ့မည်
- ဘယ်ဘက်သို့စု၍ ဖော်ပြမည်
.3 ဒသမကိန်း၃လုံးအား ဖော်ပြမည်
10.3 စစာလုံး၁၀လုံးအား ညာဘက်သို့ဖြည့်စီကာ၊ ဒသမကိန်း၃လုံးအား ဖော်ပြပေးမည်ဖြစ်သည်။

    public static void main(String[] args) {
        long data = 756659;
        
        System.out.format("%d%n", data);        // "756659"
        System.out.format("%08d%n", data);    // "00756659"
        System.out.format("%+08d%n", data);    // "+0756659"
        System.out.format("%,08d%n", data);    // "0756,659"
        System.out.format("%+,08d%n", data);    // "+756,659"
        
        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     "
        
        Calendar c = Calendar.getInstance();
        
        System.out.format("%tB %te, %tY%n", c,c,c);    // "March 12, 2014"
        System.out.format("%tD%n", c);            // "03/12/14"
    }
အထက်ဖော်ပြပါနမှုနာအတိုင်း Converter နှင့် Flag များအား အသုံးပြု၍ Formart ပြုလုပ်ရာတွင် Comment တွင် ဖော်ပြထားသည့် အတိုင်း ရရှိမည် ဖြစ်ပါသည်။


The DecimalFormat Class


ကိန်းဂဏန်းများအား ပုံစံသွင်းရာတွင် အထက်ဖော်ပြပါ နည်းလမ်းများအပြင် DecimalFormat Class အားလည်း အသုံးပြုနိုင်ပါသည်။ ပုံစံသွင်းလိုသည့် Pattern အလိုက် ပုံစံသွင်းထားသော String တန်ဖိုးအား DecimalFormat Class ၏ Object မှတဆင့် ရယူနိုင်ပါသည်။
    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat("###,###,##0.000");
        System.out.println(df.format(Math.sin(12)));
    }
အထက်တွင်ဖော်ပြထားသော နမှုနာထဲတွင် DateFormat Class ၏ Object df အား တည်ဆောက်ရာတွင် Constructor Parameter အနေနှင့် String တစ်ခုအား ရယူပါသည်။ အဆိုပါ Parameter ၏ တန်ဖိုးအနေနှင့် ပုံစံပြောင်းလိုသည့် Pattern အား ရေးသားရမည် ဖြစ်ပါသည်။ နမှုနာထဲတွင် “###,###,##0.000” ဟု ရေးသား ထားသောကြောင့်၊ အပြည့်ကိန်းများအား ၃လုံးတစ်ကြိမ် , ဖြင့် အုပ်စုခွဲပြီး၊ ဒသမကိန်းအား ၃လုံး ဖော်ပြပါမည်။ အကယ်၍ ဒသမကိန်း ၃လုံးမပြည့်ခဲ့ပါက 0 အား အစားထိုး၍ ဖော်ပြပါလိမ့်မည်။
    public static void main(String[] args) {
        System.out.println(
            new DecimalFormat("###,###.###").format(123456.789));
        System.out.println(
            new DecimalFormat("###,###.##").format(123456.789));
        System.out.println(
            new DecimalFormat("000,000.000").format(123456.789));
        System.out.println(
            new DecimalFormat("$###,##0.000").format(123456.789));
    }
# စာလုံးသည် စာလုံးအရေအတွက် သတ်မှတ်ရာတွင် အသုံးပြုပြီး၊ အကယ်၍ သတ်မှတ်ထားသော အရေအတွက် မပြည့်ခဲ့ပါက ဘာမှ ဖော်ပြမည် မဟုတ်ပေ။ 0 သည် လည်းစာလုံး အရေအတွက် သတ်မှတ်ရာတွင် အသုံးပြုနိုင်ပြီး၊ အကယ်၍ မပြည့်ခဲ့ပါက လိုအပ်သည့်နေရာများတွင် 0 အား အစားထိုး၍ ဖော်ပြသွားပါမည်။

တဖန် ဒုတိယ Format တွင် “###,###.##” ဟု ဒသမကိန်း၏ အရေအတွက်အား ၂လုံး ဖော်ပြမည်ဟု သတ်မှတ်ထား၏။ ဤနေရာတွင် 123456.789 ၏ ဒသမကိန်းသည် ၃လုံးဖြစ်၍ လက်တွေ့ ဖော်ပြရာတွင် 123,456.79 ဟု ဒသမကိန်း၏ အရေအတွက်ဖြတ်ရာတွင် နောက်ဆုံးစာလုံးအား Round Up လုပ်၍ ဖြတ်သွားသည်ကို တွေ့ရပါသည်။

2 comments:

  1. How can i change the number int value into Myanmar digit .example: for(num = 1; num < 13; num++) , i want to change the output as number 1 to ၁ and 2 to ၂ and then last 13 to ၁၃ .

    ReplyDelete
  2. Unicode Code point of 0 is 'U+0030', and Myanmar သုည '၀' is 'U+1040'.
    So that diff is 4112. If you want ascii number to Myanmar number, you can add 4112 to your number character.

    public class MyanmarNumber {

    private static final int DISTANCE = 4112;

    public static void main(String[] args) {
    System.out.println(convert(128390));
    }

    public static String convert(int number) {

    StringBuilder sb = new StringBuilder();
    for(char c : String.valueOf(number).toCharArray()) {
    char m = (char) (c + DISTANCE);
    sb.append(m);
    }

    return sb.toString();
    }
    }

    Output is ၁၂၈၃၉၀

    ReplyDelete