Regular Expression question


#1

Hi -

I would like to use gsub() to strip decimals with trailing zeros from
a string. My string looks like this:

19.0 " / 482.600 mm

I would like to end up with this:

19 " / 482.6 mm

Anyone have a regular expression that can do this?

Thanks!


#2

On Feb 27, 2009, at 2:47 PM, northband wrote:


19 " / 482.6 mm

Anyone have a regular expression that can do this?

Thanks!

It depends on how you make the string.

“19.0”.sub(/.?0+\z/,’’) #=> “19”
“482.600”.sub(/.?0+\z/,’’) #=> “482.6”

If you replace \z with (\D|\z) and substitute ‘\1’, it might work.
(You can try it out yourself.)

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#3

Awesome - this is a start - I’ll take it from here.

Thanks!

On Feb 27, 4:14 pm, Rob B. removed_email_address@domain.invalid


#4

string = ‘10.0’
string.sub!(/.\d+/, ‘’)

This will replace in place (sub!) any dot (.) followed by at least
one number (\d+) with nothing (’’).

Pepe


#5

OK, got something working you might be able to use.

Just to make things more complicated:

s = ‘19.0 / 482.600 mm / 19.060 / 482.600 mm’
s.gsub!(/(.0?[^0])?0+/, ‘\1’).gsub!(/.[\s\n]/, ‘’)

Pepe


#6

Sorry, I didn’t read your first posting fully. My solution will not
work for the case of 482.600.

Pepe


#7

Hi.

I just tested the regexp against 19.0000 and it works, but I got a
little problem with the [\s\n]I just solved:

s = ‘19.0000 / 482.600 mm / 19.060000 / 482.600 mm’
s.gsub!(/(.0?[^0])?0+/, ‘\1’).gsub!(/.([\s\n])/, ‘\1’)

This produces: ‘19 / 482.6 mm / 19.06 / 482.6 mm’

The “insignificant” trailing zeros after are always trimmed after a
decimal point.

Pepe


#8

There appear to be some good solutions here, but I thought I’d jump
in
with a bit of non-Rails technical detail.

I’d double check with the source of this data - the zeros may be
significant.
(see http://en.wikipedia.org/wiki/Significant_figures)

The data given doesn’t seem to match that (482.600 mm would be written
as
19.0000"), but it doesn’t hurt to verify…

–Matt J.