programing

후행 0.0을 자릅니다.

sourcejob 2023. 6. 13. 22:13
반응형

후행 0.0을 자릅니다.

부품 번호가 포함된 Excel 열이 있습니다.여기 샘플이 있습니다.

보시다시피 다양한 데이터 유형이 있을 수 있습니다.Float,Int,그리고.String사용 중roo파일을 읽을 보석.문제는roo정수 셀을 다음과 같이 해석합니다.Float뒤에 0을 더하는 것입니다(30431 => 16431.0).저는 이 0을 다듬고 싶습니다.사용할 수 없습니다.to_i왜냐하면 그것은 그것들에 소수가 필요한 셀들의 모든 후행 숫자들을 잘라낼 것이고 (위의 예에서 첫 번째 행), 그리고 그것의 문자열 char 뒤에 있는 모든 것을 잘라낼 것이기 때문입니다.String행(위 예제의 마지막 행).

현재 셀의 마지막 두 문자를 확인하여 ".0"이면 트리밍하는 방법이 있습니다.

def trim(row)
    if row[0].to_s[-2..-1] == ".0"
        row[0] = row[0].to_s[0..-3]
    end
end

이것은 효과가 있지만, 끔찍하고 진부한 느낌입니다.내 엑셀 파일 내용을 루비 데이터 구조로 가져오는 올바른 방법은 무엇입니까?

def trim num
  i, f = num.to_i, num.to_f
  i == f ? i : f
end

trim(2.5) # => 2.5
trim(23) # => 23

또는 문자열에서:

def convert x
  Float(x)
  i, f = x.to_i, x.to_f
  i == f ? i : f
rescue ArgumentError
  x
end

convert("fjf") # => "fjf"
convert("2.5") # => 2.5
convert("23") # => 23
convert("2.0") # => 2
convert("1.00") # => 1
convert("1.10") # => 1.1

레일을 사용하는 사용자의 경우 ActionView에는number_with_precision가 필요한 방법strip_insignificant_zeros: true이것을 다루기 위한 논쟁.

number_with_precision(13.00, precision: 2,  strip_insignificant_zeros: true)
# => 13
number_with_precision(13.25, precision: 2,  strip_insignificant_zeros: true)
# => 13.25

자세한 내용은 설명서를 참조하십시오.

대부분의 경우 이를 통해 다음과 같은 요구 사항을 충족할 수 있습니다.some_value.gsub(/(\.)0+$/, '').

뒤에 오는 모든 0과 소수점 뒤에 오는 0만 잘라냅니다.그렇지 않으면 문자열을 그대로 둡니다.

또한 입력 값이 이미 문자열이라고 가정할 때 부동소수점이나 정수 변환이 필요하지 않으므로 성능이 매우 우수합니다.

Loading development environment (Rails 3.2.19)
irb(main):001:0> '123.0'.gsub(/(\.)0+$/, '')
=> "123"
irb(main):002:0> '123.000'.gsub(/(\.)0+$/, '')
=> "123"
irb(main):003:0> '123.560'.gsub(/(\.)0+$/, '')
=> "123.560"
irb(main):004:0> '123.'.gsub(/(\.)0+$/, '')
=> "123."
irb(main):005:0> '123'.gsub(/(\.)0+$/, '')
=> "123"
irb(main):006:0> '100'.gsub(/(\.)0+$/, '')
=> "100"
irb(main):007:0> '127.0.0.1'.gsub(/(\.)0+$/, '')
=> "127.0.0.1"
irb(main):008:0> '123xzy45'.gsub(/(\.)0+$/, '')
=> "123xzy45"
irb(main):009:0> '123xzy45.0'.gsub(/(\.)0+$/, '')
=> "123xzy45"
irb(main):010:0> 'Bobby McGee'.gsub(/(\.)0+$/, '')
=> "Bobby McGee"
irb(main):011:0>

숫자 값이 유형:float으로 반환됩니다.

def convert_cell(cell)
  if cell.is_a?(Float)
    i = cell.to_i
    cell == i.to_f ? i : cell
  else
    cell
  end
end

convert_cell("foobar") # => "foobar"
convert_cell(123) # => 123
convert_cell(123.4) # => 123.4

언급URL : https://stackoverflow.com/questions/18533026/trim-a-trailing-0

반응형