質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

4760閲覧

decimalFormat で数字を3つ区切りにした場合の頭の0を表示

hijiri

総合スコア61

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

0クリップ

投稿2016/11/08 15:47

###前提・実現したいこと

decimalFormatで数字を3つ区切りにした場合、数字の頭に0がついていたら消えてしまいます。それを消さないように表示したいです。

具体的には

TextView textView = (TextView) findViewById(R.id.textView);

BigDecimal bigDecimal = new BigDecimal("0001");
DecimalFormat decimalFormat = new DecimalFormat(",###");
String str = decimalFormat.format(bigDecimal);
textView.setText(str);

とコードを書いた場合、表示される数字は「1」ですが、「0,001」と表示したいのです。

###試したこと

TextView textView = (TextView) findViewById(R.id.textView);

BigDecimal bigDecimal = new BigDecimal("0001");
DecimalFormat decimalFormat = new DecimalFormat("0,000");
String str = decimalFormat.format(bigDecimal);
textView.setText(str);

としてしまうと、「0,001」と表示されるのですが、

BigDecimal bigDecimal = new BigDecimal("01");

のときも「0,001」と表示されてしまいます。この時は「01」と表示したいのです。

どうぞよろしくお願いいたします。

223horn👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

以下のように、Groupingの設定と最小表示桁数を指定することで、BigDecimalでの出力は可能です。

java

1@Test 2public void test() { 3 DecimalFormat format = new DecimalFormat("#"); 4 5 String target = "10"; 6 7 format.setGroupingSize(3); 8 format.setGroupingUsed(true); 9 format.setMinimumIntegerDigits(target.length()); 10 11 BigDecimal n1 = new BigDecimal(10); 12 BigDecimal n2 = new BigDecimal(2010); 13 14 assertEquals("10", format.format(n1)); 15 assertEquals("2,010", format.format(n2)); 16}

投稿2016/11/09 08:26

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/11/09 12:47

質問者のテストケースをやってない時点で論外では?
A-pZ

2016/11/10 04:58

ひょっとしてここまで書くと、わかっていただけるでしょうか。 @Test public void test_01のフォーマット() { DecimalFormat format = new DecimalFormat("#"); String target = "01"; format.setGroupingSize(3); format.setGroupingUsed(true); format.setMinimumIntegerDigits(target.length()); BigDecimal n = new BigDecimal(target); assertEquals("01", format.format(n)); } @Test public void test_1000のフォーマット() { DecimalFormat format = new DecimalFormat("#"); String target = "1000"; format.setGroupingSize(3); format.setGroupingUsed(true); format.setMinimumIntegerDigits(target.length()); BigDecimal n = new BigDecimal(target); assertEquals("1,000", format.format(n)); } @Test public void test_0001のフォーマット() { DecimalFormat format = new DecimalFormat("#"); String target = "0001"; format.setGroupingSize(3); format.setGroupingUsed(true); format.setMinimumIntegerDigits(target.length()); BigDecimal n = new BigDecimal(target); assertEquals("0,001", format.format(n)); }
swordone

2016/11/10 16:17

失礼しました。setMinimumIntegerDigitsというメソッドを知りませんでした。
A-pZ

2016/11/11 01:18

でもこれってちょっと面倒な処理ではありますねぇ(´・ω・)
guest

0

BigDecimalを用いる場合のコード

java

1import java.math.BigDecimal; 2import java.text.DecimalFormat; 3class DAS{ 4 5 6public static void main(String[] args){ 7 8 9String a1="0001"; 10String a2="01"; 11 12 13String a3=""; 14 15a3=a1;//ここで上記のa1,a2その他Stringの値を代入する事で表示する選択ができる 16 17String fin=a3; 18 19StringBuilder sb = new StringBuilder(a3); 20 21int b=a3.length(); 22 23if(a3.indexOf("0")==0){ 24if(a3.lastIndexOf("0")>=2){ 25 26 27for(int g=0;g<b;g++){ 28 29int j=0; 30if(a3.contains(",")){ 31j=a3.lastIndexOf(",")-3; 32}else{ 33j=a3.length()-3; 34 35} 36if(j>0){ 37sb.insert(j,","); 38a3=new String(sb); 39} 40 41} 42 43} 44 45} 46String a4=new String(sb); 47a4=a4.replaceAll("[1-9]","0"); 48 49BigDecimal bigDecimal = new BigDecimal(fin); 50DecimalFormat decimalFormat = new DecimalFormat(a4); 51String str = decimalFormat.format(bigDecimal); 52System.out.println(str);//表示 53} 54 55 56}

投稿2016/11/09 02:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

それはBigDecimalを使うのが間違いなのでは?
0001も01もBigDecimalに変換した時点で1になり、2つの違いはなくなります。
つまり、フォーマットの形式に差異を付ける根拠がないので、出力を分けられません。

数値に変換すると差がなくなるので、文字列として加工します。

java

1String[] sample = {"0001", "01"}; 2for (String test : sample) { 3 StringBuilder builder = new StringBuilder(test); 4 int pos = test.length() - 3; 5 while(pos > 0) { 6 builder.insert(pos, ','); 7 pos -= 3; 8 } 9 System.out.println(test + " -> " + builder.toString()); 10}

###出力結果
0001 -> 0,001
01 -> 01

投稿2016/11/08 16:01

編集2016/11/08 16:13
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hijiri

2016/11/09 01:50

ありがとうございます。 Bigdecimalに変換した時点で、頭の0は消えているのですね・・・
A-pZ

2016/11/09 08:24

BigDecimalを使った場合でも、きちんと先頭0埋めが可能ですよ。
swordone

2016/11/09 12:46 編集

質問もう一度読むといいですよ。
A-pZ

2016/11/10 04:59

読んでみましたよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問