What if you’ve received a number with a whole component and a fractional component as a string? What if you need both pieces separately but not together?
I saw this question come up on stackoverflow and thought it could be useful to answer here as well.
There’s a bit of this question that is, quite frankly, ridiculous. And my answer on stackoverflow was not as in depth as I think it should have been.
Here’s the initial answer:
string input = "127.45"; var numberPieces = input.Split(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator); int wholePiece = Int32.Parse(duration); int fractionalPiece = Int32.Parse(duration);
The key here is to use
CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator instead of
'.'. This ensures that your code works globally. Did you know that every country does not use the period as the decimal indicator? Some countries use the comma. This will use the correct separator for your user.
The rest is simple enough. The split creates a string array with the first element being the whole component and the second element the fractional component. Both of these are run through Int32.Parse() since they should be integers.
The problem here — that I didn’t address in my stackoverflow answer — is that maybe they aren’t. We haven’t verified that the input format is actually able to be converted to a double.
This is the improved solution:
string input = "123.21"; double result; bool isDouble = Double.TryParse(input, result, CultureInfo.InvariantCulture); if(!isDouble) throw new InvalidArgumentException("String provided in incorrect format."); int wholePiece = Decimal.Truncate(result); int fractionalPiece = (int)(result - (double)wholePiece);
Now I’m doing TryParse to ensure that the format of the supplied string is actually a double, and still maintaining the global nature of the code with the InvariantCulture in the TryParse parameters.