Swift:找出整数有几位数

问题描述

我没有正确的英语或数学词汇来真正解释我想要做什么,但我会尽力解释。基本上,我想弄清楚一个整数有多大,有多少个小数位。例如1234是“一千”数字,而2,987,123是“一百万”数字。

我可以做这样的事情,但这很愚蠢:)

extension Int {
  func size() -> Int {
    switch self {
    case 0...99:
      return 10

    case 100...999:
      return 100

    case 1000...9999:
      return 1000

    case 10000...99999:
      return 10000

    case 100000...999999:
      return 100000

    case 1000000...9999999:
      return 1000000

    default:
      return 0 // where do we stop?
    }
  }
}

解决方法

使用对数的解决方案:

注意:由于Double无法完全表示转换为log10的大型Int的{​​{1}},因此该解决方案有局限性。它开始失败约15 Double的位数非常接近10的下一个幂(例如 Int

这是一个问题:

999999999999999
 log10(Double(999999999999999)) == log10(Double(1000000000000000))

使用字符串的解决方案:

通过完全使用extension Int { var size: Int { self == 0 ? 1 : Int(pow(10.0,floor(log10(abs(Double(self)))))) } } Int来避免任何数学表示错误。

String

任何extension Int { var size: Int { Int("1" + repeatElement("0",count: String(self.magnitude).count - 1))! } } 的通用版本:

我与@LeoDabus合作,为任何整数类型提供了 generic 版本:

FixedWidthInteger

示例:

extension FixedWidthInteger {
    var size: Self {
        Self("1" + repeatElement("0",count: String(self.magnitude).count - 1))!
    }
}
,

我想到了这个

extension Int {
  func size() -> Int {
    var size = 1
    var modifyingNumber = self

    while modifyingNumber > 10 {
      modifyingNumber = modifyingNumber / 10
      size = size * 10
    }

    return size
  }
}

有效,但这势在必行。

,

这太傻了吗?

extension Int {
    var size : Int {
        String(self).count
    }
}

我的推理是,“数字”确实是一种书写方式,因此转换为String可以回答真正的问题。然后,将大小转换回数字(即对应的10的幂)将自然返回到对数答案。 :)