数値を任意の小数点位置で表現された文字列に変換する : Objective-C プログラミング
PROGRAM
.auto-style1
{
white-space: nowrap;
text-align: right !important;
}
.auto-style2 {
white-space: nowrap;
text-align: right !important;
}
.auto-style3 {
}
.auto-style4 {
white-space: nowrap;
text-align: right !important;
}
.case1 {
color: #008000 !important;
}
.case2 {
color: #7D1B90 !important;
}
数値を任意の小数点位置で表現された文字列に変換する
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 桁ごとのカンマ区切りで表現することも可能です。
[ もどる ]