数値を任意の小数点位置で表現された文字列に変換する : Objective-C プログラミング

PROGRAM


数値を任意の小数点位置で表現された文字列に変換する

Objective-C では、NSNumberFormatter を使用して、数値を任意の小数点数桁までの文字列に変換できます。

// 数値を NSNumber 型に変換します。

NSNumber* number = [[NSNumber alloc] initWithDouble:aValue];

 

// 小数点以下、最低 3 桁、最大 6 桁までを表示する NSNumberFormatter を用意します。

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];

 

formatter.numberStyle = NSNumberFormatterDecimalStyle;

formatter.minimumFractionDigits = 3;

formatter.maximumFractionDigits = 6;

 

// NSNumberFormatter を使用して、数値を小数点数 3 桁〜 6 桁までで表現した文字列を取得します。

NSString* string = [formatter stringFromNumber:number];

ここで、minimumFractionDigits というのは、最低でもこの桁数の小数点を表示するという意味になります。maximumFractionDigits の方は、それ以上の小数点の桁が現れた場合には、その桁に丸めて表示するという意味です。

注意したいのが、これらは NSUInteger 型ですけど、少なくとも Xcode 4.5 + iOS 6.0 SDK では、ここに NSIntegerMax よりも大きい値を設定すると負の値と勘違いするのか、0 を設定したのと同じ動きになるようでした。

 

さて、このようにすることで、次のように文字列化された値を取得できました。

変換前 変換後
1234.5 "1234.500"
1234.5678 "1234.5678"
1234.5678987 "1234.567899"

丸められる部分については、既定では四捨五入 (NSNumberFormatterRoundHalfUp) される様子です。

この動きを調整したい場合には、NSNumberFormatter の roundingMode プロパティを調整します。

指定子 用途 1.24
-1.24
1.24
-1.24
1.24
-1.24
1.34
-1.34
1.35
-1.35
1.36
-1.36
NSNumberFormatterRoundCeiling 最大の値を採ります。その桁よりも値が続く場合は、現在の値のその次(増える方向)の値が採用されます。 1.3
-1.2
1.3
-1.2
1.3
-1.2
1.4
-1.3
1.4
-1.3
1.4
-1.3
NSNumberFormatterRoundFloor 最低の値を採ります。その桁よりも値が続く場合は、現在の値のその前(減る方向)の値が採用されます。 1.2
-1.3
1.2
-1.3
1.2
-1.3
1.3
-1.4
1.3
-1.4
1.3
-1.4
NSNumberFormatterRoundDown 切り捨てです。その桁よりも続く値を、値の正負は考えずに、とにかく余った部分をカットします。 1.2
-1.2
1.2
-1.2
1.2
-1.2
1.3
-1.3
1.3
-1.3
1.3
-1.3
NSNumberFormatterRoundUp 切り上げです。その桁よりも値が続く場合は、正の値と考えて指定桁に 1 を加え、符号を元に戻します。 1.3
-1.3
1.3
-1.3
1.3
-1.3
1.4
-1.4
1.4
-1.4
1.4
-1.4
NSNumberFormatterRoundHalfEven 四捨五入の変則です。指定桁の次の値が、0 から 4 までは「切り捨て」し、6 から 9 までは「切り上げ」します。5 については、偶数になる方向に調整します。 1.2
-1.2
1.2
-1.2
1.3
-1.3
1.3
-1.3
-1.4
-1.4
1.4
-1.4
NSNumberFormatterRoundHalfDown 四捨五入の変則です。指定桁の次の値が、0 から 5 までは「切り捨て」し、6 から 9 までは「切り上げ」します。5 の場合に切り捨てるのがポイントです。 1.2
-1.2
1.2
-1.2
1.3
-1.3
1.3
-1.3
1.3
-1.3
1.4
-1.4
NSNumberFormatterRoundHalfUp 四捨五入です。指定桁の次の値が、0 から 4 までは「切り捨て」し、5 から 9 までは「切り上げ」します。5 の場合に切り上げるのがポイントです。 1.2
-1.2
1.3
-1.3
1.3
-1.3
1.3
-1.3
1.4
-1.4
1.4
-1.4

NSNumberFormatterRoundHalfEven と NSNumberFormatterRoundHalfUp や NSNumberFormatterRoundHalfDown の違いが分かりにくいですけど、名前から察せる通り、中央 (Half) である 5 の取り扱いを、値が最終的に偶数 (Even) になるように切り捨て・切り上げを調整するか、切り上げる (Up) か、切り捨てる (Down) か、といった動作になっています。

Half のつかない NSNumberFormatterRoundUp と NSNumberFormatterRoundDown は、Half が付くもののと違い、値が中央 (Half) かどうかにかかわらず、少しでもはみ出したら、切り上げる (Up) か切り捨てる (Down) かという動作になります。

NSNumberFormatterRoundCeiling と NSNumberFormatterRoundFloor の違いは、値を、プラス(増加方向)を上、マイナス(減少方向)を下の数直線で考えたときに、天井 (Ceiling) 側の値を採用するか、床 (Floor) 側の値を採用するかという動作です。

 

このように柔軟に、小数点数を任意の桁で丸めた文字列を取得することができます。

このとき、NSNumberFormatter を使用しているので、数値を桁区切りの文字列に変換する で記した方法を組み合わせることで、整数部分を 3 桁ごとのカンマ区切りで表現することも可能です。

[ もどる ]