как сделать преобразование строк в objective-c?

<p>я хочу преобразовать строку в двойную и после некоторой математики преобразовать ее обратно в строку.</p><p>как мне сделать это в objective-c?</p><p>есть ли способ округлить двойное число до ближайшего целого числа?</p>

<p>вы можете конвертировать nsstring в двойной с</p><pre><code>double mydouble = [mystring doublevalue]; </code></pre><p>округление до ближайшего целого может тогда быть сделано как</p><pre><code>int myint = (int)(mydouble + (mydouble>0 ? 0.5 : -0.5)) </code></pre><p>я, честно говоря, не уверен, есть ли более простой способ конвертировать обратно в строку, чем</p><pre><code>nsstring* mynewstring = [nsstring stringwithformat:@"%d", myint]; </code></pre>

<p>чтобы правильно преобразовать строку в число, вам необходимо использовать экземпляр <a href="https://developer.apple.com/documentation/foundation/nsnumberformatter"><code>nsnumberformatter</code></a> , настроенный для локали, из которой вы читаете строку.</p><p>разные локали будут форматировать числа по-разному. например, в некоторых частях мира <code>comma</code> используется в качестве десятичного разделителя, в то время как в других это <code>period</code> - и разделитель тысяч (при использовании) переворачивается. за исключением случаев, когда это пробел. или нет вообще.</p><p>это действительно зависит от происхождения входных данных. самое безопасное, что нужно сделать, - это настроить <code>nsnumberformatter</code> для способа форматирования вашего ввода и использовать <code>-[nsformatter numberfromstring:]</code>, чтобы получить <code>nsnumber</code> из него. если вы хотите обрабатывать ошибки преобразования, вы можете использовать вместо этого <code>-[nsformatter getobjectvalue:forstring:range:error:]</code>.</p>

<p>добавляя к ответу olliej, вы можете преобразовать int обратно в строку с <code>nsnumber</code>'s <code>stringvalue</code>:</p><pre><code>[[nsnumber numberwithint:myint] stringvalue] </code></pre><p><code>stringvalue</code> для <code>nsnumber</code> вызывает <code>descriptionwithlocale:nil</code>, давая вам локализованное строковое представление значения. я не уверен, что <code>[nsstring stringwithformat:@"%d",myint]</code> даст вам правильно локализованное представление <code>myint</code>.</p>

<p>вот рабочий пример nsnumberformatter, читающий локализованное число string (xcode 3.2.4, osx 10.6), чтобы сэкономить другим часы, которые я только что потратил. осторожно: хотя он может обрабатывать конечные пробелы, такие как "8 765,4", он не может обрабатывать начальные пробелы и не может обрабатывать произвольные текстовые символы. (неверные строки ввода: "8" и "8q" и "8 q".)</p><pre><code>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 </code></pre>

<p>метод округления <a href="http://en.wikipedia.org/wiki/rounding"></a> олли не подходит для отрицательных чисел</p><ul> <li>2,4 округляется до 2 (метод оллиэя дает это право)</li> <li>-2,4 округляется до -2 (метод оллия возвращает -1)</li> </ul><p>вот альтернатива</p><pre><code> int myint = (int)(mydouble + (mydouble>0 ? 0.5 : -0.5)) </code></pre><p>конечно, вы можете использовать функцию округления из math.h</p>

<pre><code>// 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]; </code></pre>

<p>для преобразования числа в строку, как насчет использования нового литерального синтаксиса (xcode> = 4.4), он немного более компактен.</p><pre><code>int myint = (int)round( [@"1.6" floatvalue] ); nsstring* mystring = [@(myint) description]; </code></pre><p>(объединяет его как <a href="https://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/classes/nsnumber\_class/reference/reference.html">nsnumber</a> и преобразует в строку, используя <a href="https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/protocols/nsobject\_protocol/reference/nsobject.html#//apple\_ref/occ/intfm/nsobject/description">метод описания nsobjects</a> )</p>

<p>для округления вы, вероятно, должны использовать функции c, определенные в math.h.</p><pre><code>int roundedx = round(x); </code></pre><p>удерживайте option и дважды щелкните <code>round</code> в xcode, и он покажет вам страницу руководства с различными функциями для округления различных типов.</p>

<p>в итоге я использовал этот удобный макрос:</p><pre><code>#define string(value) [@(value) stringvalue] </code></pre>

<p>из этого примера вы можете увидеть преобразования в обоих направлениях:</p><pre><code>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); </code></pre>

<p>преобразовать текст, введенный в текстовое поле, в целое число</p><pre><code>double mydouble=[\_mytextfield.text doublevalue]; </code></pre><p>округление до ближайшего двойного</p><pre><code>mydouble=(round(mydouble)); </code></pre><p>округление до ближайшего целого (с учетом только положительных значений)</p><pre><code>int myint=(int)(mydouble); </code></pre><p>преобразование из двойного в строку</p><pre><code>mylabel.text=[nsstring stringwithformat:@"%f",mydouble]; </code></pre><p>или же</p><pre><code>nsstring *mystring=[nsstring stringwithformat:@"%f",mydouble]; </code></pre><p>преобразование из int в строку</p><pre><code>mylabel.text=[nsstring stringwithformat:@"%d",myint]; </code></pre><p>или же</p><pre><code>nsstring *mystring=[nsstring stringwithformat:@"%f",mydouble]; </code></pre>

<p>это самый простой способ, который я знаю:</p><pre><code>float myfloat = 5.3; nsinteger myint = (nsinteger)myfloat; </code></pre>