Objective-Cで文字列変換を行う方法は?


145

文字列をdoubleに変換し、いくつかの計算を行った後、それを文字列に戻します。

Objective-Cでこれを行うにはどうすればよいですか?

doubleを最も近い整数に丸める方法はありますか?


Chris Hansonの回答に加えて、数値フォーマッター、その動作、およびフォーマット文字列の詳細については、Mac OS X 10.4のNSNumberFormatterの「Cocoaのデータフォーマットプログラミングガイド」を参照してください
mmalc 2008年

NSNumberFormatterに関するこの記事は、参考になるかもしれません。iphonesdkarticles.com
2008/11

公式ドキュメントはかなり良いと思います...

回答:


231

あなたはNSStringをdoubleに変換することができます

double myDouble = [myString doubleValue];

次に、最も近いintへの丸めを次のように行うことができます

int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

文字列に戻すためのより効率的な方法があるかどうか、正直なところわかりません

NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];

13
ロケールによって数値のフォーマットが異なるため、これを実行する必要はありません。「1000」を1000と書き込むものもあれば、「1,000」と「1.000」を書き込むものもあります。-[NSString doubleValue]から取得するものはどれですか。
Chris Hanson、

9
倍精度浮動小数点数は数値データタイプです。フォーマットは含まれていません。[NSString doubleValue]を呼び出すと、数値であるため1000が返されます。
アンディ

12
また、NSStringには数値を含めることはできません。数値の表現のみを含めることができます。その表現は、ロケールによって異なるさまざまな形式のいずれかになります。
Chris Hanson、

5
@Barry Warkの答えを自分の答えに統合したいかもしれません[[NSNumber numberWithInt:myInt] stringValue]
Dan Rosenstark

1
文字列値が有効なdouble文字列でない場合、doubleValueによって0.0が返されます。文字列が有効な二重文字列を表さない場合はnilが返されるため、NSNumberFormatterの使用を提案するソリューションの方が良いように思えます。
カイデル

70

実際に文字列から数値に正しく変換するには、文字列をNSNumberFormatter読み取っているロケール用に構成されたのインスタンスを使用する必要があります。

ロケールが異なれば、数値のフォーマットも異なります。たとえば、世界の一部の地域ではCOMMA小数点が区切り記号として使用されていますが、その他の地域ではPERIOD-桁区切り記号(使用されている場合)が逆になっています。スペースの場合を除きます。またはまったく存在しない。

それは本当に入力の出所に依存します。最も安全なNSNumberFormatter方法は、入力をフォーマットする方法を設定し-[NSFormatter numberFromString:]NSNumberことです。変換エラーを処理したい場合は、-[NSFormatter getObjectValue:forString:range:error:]代わりに使用できます。


2
または、ローカライズされたスキャナーを使用することもできます。たとえば、[NSScanner localizedScannerWithString:]で作成されたスキャナーを使用すると、[scanner scanDouble:&aDouble]はユーザーの現在のロケールに基づいてdoubleをスキャンします。
dreamlax 2009年

32

olliejの答えに追加すると、intからNSNumber's を使用して文字列に変換できますstringValue

[[NSNumber numberWithInt:myInt] stringValue]

stringValueNSNumber呼び出すdescriptionWithLocale:nil、あなたの値のローカライズされた文字列表現を与えます。が[NSString stringWithFormat:@"%d",myInt]適切にローカライズされたの表現を提供するかどうかはわかりませんmyInt


バリーに感謝します。あなたが投稿したNSNumberからstringValueへの行は私にとっては機能しましたが、NSString stringWithFormatは機能しませんでした。
マーク

7

olliejの丸め方法は負の数では間違っています

  • 2.4丸めは2です(olliejの方法はこれを正しく行います)
  • −2.4丸めは−2(olliejのメソッドは-1を返す)

ここに代替があります

  int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))

もちろん、math.hの丸め関数を使用することもできます。


7

以下は、ローカライズされた数値文字列(xCode 3.2.4、osX 10.6)を読み取るNSNumberFormatterの実用的なサンプルです。注意: "8,765.4"のような末尾の空白は処理できますが、これは先行空白を処理できず、浮遊テキスト文字を処理できません。(不正な入力文字列:「8」、「8q」、「8 q」。)

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen

1
文字列が有効な文字列でない場合、numberFromStringは何を返しますか?
Ben Clayton

numberFromString:NSNumberオブジェクトを返します。Apple docsのNumberFormattingおよびNSNumberFormatterを参照してください。(NSNumberオブジェクトが「数値ではない」または「不正な数値」をどのようにエンコードするかはわかりませんが、NSNullの可能な値があることがわかります。)
miker

@BenClayton numberFromStringは、解析できない場合にnil値を返しますNSNumber*。先頭の空白と迷子のテキスト文字に関する問題を再現できません。IMOは正常に機能しています。" 28.5 "28.5として解析し、そして"gibberish28.5""28.5gibberish"、および"gibberish28.5gibberish"すべて解析できないです。" 2 8 . 5. "解析不可能ですが、それは珍しいことではありません。
jrh

3
// Converting String in to Double

double doubleValue = [yourString doubleValue];

// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal

// Converting double to int

int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];

3

数値から文字列への変換については、新しいリテラル構文(XCode> = 4.4)を使用すると、もう少しコンパクトになります。

int myInt = (int)round( [@"1.6" floatValue] );

NSString* myString = [@(myInt) description];

(それをNSNumberとしてボックス化し、NSObjectsの記述メソッドを使用して文字列に変換します)


2

丸めには、math.hで定義されているC関数を使用する必要があります。

int roundedX = round(x);

Optionを押しroundたままXcode をダブルクリックすると、さまざまな型を丸めるためのさまざまな関数を含むmanページが表示されます。



1

この例では、コンバージョンを双方向で確認できます。

NSString *str=@"5678901234567890";

long long verylong;
NSRange range;
range.length = 15;
range.location = 0;

[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];

NSLog(@"long long value %lld",verylong);

1

テキストフィールドに入力されたテキストを整数に変換します

double mydouble=[_myTextfield.text doubleValue];

最も近いdoubleに丸める

mydouble=(round(mydouble));

最も近い整数に丸める(正の値のみを考慮)

int myint=(int)(mydouble);

doubleからstringへの変換

myLabel.text=[NSString stringWithFormat:@"%f",mydouble];

または

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

intからstringへの変換

myLabel.text=[NSString stringWithFormat:@"%d",myint];

または

NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];

1

私はこの便利なマクロを使用してしまいました:

#define STRING(value)               [@(value) stringValue]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.