【问题标题】:NSNumber storing float. Please NO scientific notation?NSNumber 存储浮点数。请不要科学记数法?
【发布时间】:2010-09-29 15:17:16
【问题描述】:

我的代码是这样的

NSNumber *inputToNumber = [NSNumber numberWithFloat:[textField.text floatValue]];

文本字段中的值实际上是一个电话号码。它作为烦人的 (2.0)78966e+08 存储在 NSNumber 中

我怎样才能让 NSNumber 将其存储为 0207896608?

【问题讨论】:

    标签: ios objective-c cocoa-touch string-formatting phone-number


    【解决方案1】:

    我认为将电话号码存储到 NSNumber 中的基本想法是有缺陷的:

    • 如何区分带或不带前导 0 的数字?
    • 您如何存储来自国外的电话号码?

    我会用 NSString 代替 NSNumber。

    【讨论】:

      【解决方案2】:

      仅仅因为它被称为数字并不意味着“电话号码”是与“5”或“pi”相同的数字。

      您应该将电话号码视为一个字符串,或者您应该创建一个 TelephoneNumber 模型类来表示每个电话号码。

      【讨论】:

        【解决方案3】:

        考虑到世界上有些地方的数字没有前导 0,并且带有前导 0 的数字与没有前导 0 的相同数字不同。

        05843924 != 5843924
        

        所以不要再对NSNumber hacks 偷懒了,建立你自己的电话号码类。

        【讨论】:

          【解决方案4】:

          许多计算机语言都使用科学记数法作为非常大(或非常小的)数字的默认输出。如果希望数字输出为十进制,则需要指定输出格式(实现因语言而异)

          另外,julesjacobs 是正确的。您不应将 FLOAT 用于电话号码,因为它会出现二进制舍入错误。使用 INT 或 STRING 可以省去很多麻烦。

          【讨论】:

          • 不,你不能使用 int。电话号码可以从零开始,并且可以包含语义上有意义的非数字,例如 # 或 *。除非你真的非常确定你知道什么是有效的电话号码,否则不要对它做出假设。 (这适用于多种类型的输入验证。)
          • 我同意。我指的是美国的电话号码,因为这就是我必须处理的全部内容。对于国际号码,INT 不会这样做。
          【解决方案5】:

          如果您需要能够将其作为数字处理,也许您应该将其分解为多个部分,并将每个部分存储为一个整数。

          01112223333
          country code 0
          area code 111
          prefix 222
          number 3333
          

          或者,如果您不需要操作它,您可以将整个内容存储为字符串。

          【讨论】:

          • 并非所有国家/地区的电话号码格式都相同。一个电话号码在 B 国甚至可能与在 A 国的样子不同。即使你能弄清楚哪些是哪个块,“*”、“#”和“,”又是什么?整数仍然不起作用。
          【解决方案6】:

          您是否将电话号码存储在浮点数中?您应该考虑使用整数或字符串。也许:

          NSNumber *inputToNumber = [NSNumber numberWithInt:[textField.text intValue]];
          

          【讨论】:

          • 你如何在那个整数中表示“*”、“#”或“,”?
          【解决方案7】:

          嘿,伙计们,您对此有何看法,这似乎完全满足了我的目的。目前只有英国,所以当我有机会时会担心本地化。

          我用它来存储号码

          NSNumber *inputToNumber = [NSNumber numberWithLongLong:(long long)[[textField.text stringByReplacingOccurrencesOfString:@" " withString:@""] longLongValue]];
          

          此方法格式化我的电话号码并处理前面提到的 0。

          -(NSString *)phoneNumberString:(NSNumber *)phoneNumber {
              //Add a zero because NSNumber won't save a preceeding zero
              NSString *telephoneString = [[NSString alloc] initWithFormat:@"0%@", [phoneNumber stringValue]];
          
              if (telephoneString.length >= 4) {
                  NSString *firstPart = [[NSString alloc] initWithString: [telephoneString substringToIndex:4]];
                  NSString *secondPart = [[NSString alloc] initWithString: [telephoneString substringFromIndex:4]];
          
                  //Add the two parts together with a space inbetween
                  NSString *formattedTelephoneString = [NSString stringWithFormat:@"%@ %@", firstPart, secondPart];
          
                  //send it back to the cellForRow TableCell Method
                  [firstPart release];
                  [secondPart release];
                  [telephoneString release];
          
                  return formattedTelephoneString;    
              }
              else {
                  return telephoneString; 
              }
          }
          

          感谢所有 cmets。我会将答案标记为建议 NSString 的人,因为我担心我会恢复使用 NSString 来代替我上面的解决方法。

          【讨论】:

          • 您的代码正在泄漏内存。你应该在返回之前自动释放telephoneString,或者使用便捷的方法stringWithString而不是[[NSString alloc] initWith..],这样你就不用担心释放了。
          • 我对前面的 0 的意思是,并非所有电话号码都有前面的 0,并且对于整数值,您无法对其进行编码(除非您为此目的使用减号)。
          猜你喜欢
          • 1970-01-01
          • 2014-09-25
          • 2021-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多