-->

How to show only the first two digits with NSNumbe

2019-06-10 06:53发布

问题:

I have a number for an example 1329094. I want to get only the first two digits that I make see 13

I create NSNumberFormatter like

 func setReceivedChart(description: [String], value: [Double]) {
        var descriptionString: String!
        var formatterNumber: NSNumber!
        var chartDataEntryArray = [ChartDataEntry]()
        for item in 0..<description.count {
            let chartEntry = ChartDataEntry(value: value[item], xIndex: item)
            chartDataEntryArray.append(chartEntry)
            descriptionString = description[item]
            formatterNumber = value[item]
        }
        let dataSet = LineChartDataSet(yVals: chartDataEntryArray, label: "")
        dataSet.drawCircleHoleEnabled = false
        dataSet.drawCirclesEnabled = true // change
        dataSet.drawCubicEnabled = true
        dataSet.drawFilledEnabled = true
        dataSet.circleRadius = 3.0 // for iphone
        dataSet.drawValuesEnabled = true

        print(descriptionString)


        let numberFormatter = NSNumberFormatter()
        numberFormatter.numberStyle = .NoStyle
       numberFormatter.usesSignificantDigits = true
       numberFormatter.maximumSignificantDigits = 2

        dataSet.valueFormatter = numberFormatter

        // set color 47 206 255
        dataSet.fillColor = UIColor(red: 47/255, green: 206/255, blue: 255/255, alpha: 1.0)
        let chartData = LineChartData(xVals: description, dataSet: dataSet)
        receivedChartView.data = chartData
    }

But I see the result 1300000

UPDATE I cannot because the data is required for the graphics, I measure them in bytes for the construction of a good schedule. If I initially transformed into different values such as megabytes and bytes, the 704 bytes will be more than 1.5 megabytes in the chart

回答1:

Why not convert the number to String, strip the unwanted digits and convert it back.

let number = 1329094
let numberAsString = String(number)
let subString = numberAsString.substringToIndex(numberAsString.startIndex.advancedBy(2))
let trimmedNumber = Int(subString)

or

let number = 1329094
let numberOfDigits = String(number).characters.count
let trimmedNumber = number / Int(pow(10.0, Double(numberOfDigits - 2)))


回答2:

I am unaware of a number formatter that will scale the number (remove trailing zeroes) except for NSByteCountFormatter. Therefore you will need to scale each data point in the loop before adding it to your chart array. Maybe something like this.

NOTE: It seems very risky to chart something only using nonzero, significant figures. Charting 12, 120, 1200, 12000, and 120000000000000 will all show the same values.

func setReceivedChart(description: [String], value: [Double]) {
  let significantFigures = NSNumberFormatter()
  significantFigures.usesSignificantDigits = true
  significantFigures.maximumSignificantDigits = 2

  var chartDataEntryArray = [ChartDataEntry]()
  for item in 0..<description.count {
    if let datum = significantFigures.stringFromNumber(value[item]) {
      datum.stringByReplacingOccurrencesOfString("0", withString: "", options: .LiteralSearch, range: nil)
      let chartEntry = ChartDataEntry(value: Double(datum), xIndex: item)
      chartDataEntryArray.append(chartEntry)
    }
    else {
      // handle error, keep charDataEntryArray in sync with description[]
    }
  }

  let dataSet = LineChartDataSet(yVals: chartDataEntryArray, label: "")
  dataSet.drawCircleHoleEnabled = false
  dataSet.drawCirclesEnabled = true // change
  dataSet.drawCubicEnabled = true
  dataSet.drawFilledEnabled = true
  dataSet.circleRadius = 3.0 // for iphone
  dataSet.drawValuesEnabled = true

  let numberFormatter = NSNumberFormatter()
  numberFormatter.numberStyle = .NoStyle
  dataSet.valueFormatter = numberFormatter

  // set color 47 206 255
  dataSet.fillColor = UIColor(red: 47/255, green: 206/255, blue: 255/255, alpha: 1.0)
  let chartData = LineChartData(xVals: description, dataSet: dataSet)
  receivedChartView.data = chartData
}