Android SDK 通貨書式について

1,303 views
Skip to first unread message

io

unread,
Jun 6, 2011, 8:33:15 AM6/6/11
to Android-SDK-Japan
いつもお世話になります。
自身で調べてみたものの金額表示の書式適用について、
 「-¥999,999,999」のような体裁(日本円については3桁毎の区切り)で表示ができずに困っております。

Java-SE 1.6なら問題無いのですが、『Android SDK』では、
DecimalFormat.getCurrencyInstance() (またはこれに並ぶFormat処理)において「-¥
999,999,999」(日本円につぃては3桁毎の区切り)の表示に対応できていないのでしょうか?
レイアウトエディター(xml)で対応できるはず、というご指定があれば、(寧ろ)そういうご回答をお願いします。

未熟初心者で大変恐れ入りますが、何か良い方法がございましたらどうかご教授ください。

(各国通貨を扱いたく、あまり下の「→ 懸念点」の掲載部分ような歪なコーディングはしたくないと考えております。)

粗末なコーディングで申し訳ありませんが、質問用のソースを貼り付けておきます。


/**
* 画面出力アクティビティ.
* <p>
* ActivityInputからintentを受信し、処理結果を画面出力する。
* </p>
* @author io
*/
public class ActivityOutput extends Activity {
/** アクティビティ間のプレフィックス: 金額項目. */
private static final String PREFIX_AMOUNT =
ActivityInput.PREFIX_AMOUNT;

/**
* アクティビティ ActivityOutput.
* <p></p>
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityoutput);
Bundle extras = getIntent().getExtras();
if (extras != null) {
Locale loc = Locale.getDefault();

/*
* 金額書式を日本円であれば“-¥999,999,999”としたい。が、
* DecimalFormat.getCurrencyInstance() だと接頭辞に通貨シンボルが付くのみ。
* → カンマ区切りにならない。
*
* DecimalFormat fmtAmount = (DecimalFormat)
DecimalFormat.getCurrencyInstance(loc); // ×
* DecimalFormat fmtAmount = (DecimalFormat)
DecimalFormat.getNumberInstance(loc); // ×
* NumberFormat fmtAmount =
NumberFormat.getCurrencyInstance(loc); // ×
* if (loc.equals(Locale.JAPAN)==true) {
* fmtAmount.setMinimumFractionDigits(0); //日本円は 小数点以下表示を除外
* fmtAmount.setMaximumFractionDigits(0);
* } else {
* fmtAmount.setMinimumFractionDigits(0); //他国通貨は小数点以下桁数がどうあれ表示
* fmtAmount.setMaximumFractionDigits(5);
* }
* fmtAmount.setGroupingUsed(true); //TODO …カンマ区切り表示に変化しない? (そもそも
android SDK が未対応?)
*/

/*
* 強制的に次の2つのNumberFormatで書式を適用した文字列を用いることを検討するが…
*
* DecimalFormat.getCurrencyInstance(loc) による通貨書式化は、
* “-¥9,999,999”という様式で表示。
* 下の対応では “¥-9,999,999”という様式で表示。
*
* → 懸念点
* Android SDKが今後DecimalFormat.getCurrencyInstance(loc)でカンマ区切りまで対応
してくれるようになった場合に、
* 下のコーディングだと、“¥-¥9,999,999”というように、おかしな表示になってしまう。
* → 疑問点
* 現状のSDKでもっと相応しいロジックがあるのか不明。
*/
NumberFormat fmtSymbol = NumberFormat.getCurrencyInstance(loc);
NumberFormat fmtAmount = new DecimalFormat("#,##0.#####;-
#,##0.#####");

TextView txtvwAmt = (TextView)findViewById(R.id.TxtvwAmt);
txtvwAmt.setText(
fmtSymbol.getCurrency().getSymbol() +

fmtAmount.format(Double.valueOf(extras.getCharSequence(PREFIX_AMOUNT).toString()))
);
}

Button btnReturn = (Button)findViewById(R.id.BtnReturn);
btnReturn.setOnClickListener(new View.OnClickListener() {
/**
* ボタンウィジェット btnReturn (戻る)押下処理.
* <p></p>
* @see
android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
});
}
}

Keiji Ariyama

unread,
Jun 7, 2011, 6:08:01 AM6/7/11
to android-...@googlegroups.com, io
有山と申します。

 1.6のエミュレータで確認したところ、ioさんが仰る通り、コンマ区切りで
フォーマットされない不具合が有りました。
 また、2.0以上のエミュレータ及び実機で確認したところ、以下のとおり順当
なコードで正常動作が確認できました。

NumberFormat nf = NumberFormat.getCurrencyInstance();
nf.setMaximumFractionDigits(0);
String str2 = nf.format(-5000000); // -\5,000,000 と、フォー
マットされる

 1.6をどうしてもサポートしたい場合、例えば下記のようにしてはいかがで
しょうか。

public class MainActivity extends Activity {
private static String sFormat = String.format("%s#,##0.###",

NumberFormat.getCurrencyInstance().getCurrency().getSymbol());

private void method1() {
DecimalFormat df = new DecimalFormat(sFormat);
String str1 = df.format(-200000000); // -\200,000,000 と、
フォーマットされる
}
}

 また、String.formatに指定するフォーマットを文字列リソースに出して、ロ
ケール別に切り替えることも出来ると思います。

有山

--
Keiji,
ml_an...@c-lis.co.jp

io

unread,
Jun 7, 2011, 11:49:57 AM6/7/11
to Android-SDK-Japan
お世話になります。
仰る通り 1.6のエミュレータでプログラムを作成していました。
その辺も掲載しておくべきでした。

小生個人の結論としては、特に1.6に拘る必要が無いので2.0以上のエミュレータで対応します。
まずは、ご回答 大変ありがとうございました。


"%s#,##0.###"
についてでありますが、欧州通貨のユーロなどは、
「Java SE」においては、 DecimalFormat.getCurrencyInstance(loc)
で処理してみると、
“-9,999,999 EURO ”
というように、通貨シンボルが『末尾表記』の体裁になるので、
Android SDKにおいてのコーディング要領に困っておりました。
これについても、懸念としての記載が足りず、申し訳ありませんでした。

明日以降エミュレーターを替えて検証してみます。
大変助かりました。
Reply all
Reply to author
Forward
0 new messages