At 5/6/2007 09:39 AM, Todd Cary wrote:
You make a good point. What is your suggestion for the following sequence:
$number = $row->AMOUNT; // Get the double from MySQL
To display the number in the HTML edit field, I do
$display_number = number_format($number, 2, '.', '');
The user may enter a character that will not be accepted by MySQL, so I do
$mysql_number = preg_replace('/[^0-9^\.]/', '', $display_number);
Ah. I had earlier assumed that you were supplying the same numeric
value to two output destinations -- display and SQL. Instead, you're
taking a single value from SQL to input and another single value from
input to SQL. Even if you understand that these are the same number
in the context of the application, they could as easily be totally
separate because the two operations are disconnected from one another:
1) [SQL] --> [transform 1] --> [input]
2) submit form
3) [input] --> [transform 2] --> [SQL]
Transform 1 converts from the pure float value to a formatted string,
for which number_format() works fine. (You mentioned that these are
dollar amounts, but I wouldn't bother including the currency symbol
in with the input text, rather more like:
Enter price: $[__0.00]
where [___] is the input field.)
Transform 2 converts whatever the user has entered into a valid
numeric to pass to SQL. For many applications, I don't think a good
input validation routine would simply delete any non-numeric
character from the input. A user could erroneously type oh for zero,
el for one, or hit the shift key while typing a digit. Better, I
think, to preserve the input if it isn't valid and ask the user to
reconsider. Their own correction of their input might be
significantly different from a simple reduction.
A regular expression pattern to check for valid currency input might be:
[+-($]*\d{1,3}(,\d{3})*(\.\d*){0,1}\){0,1}
[+-($]* zero or more: plus, minus, open-paren, or currency symbol
\d{1,3} one to three: numeric digits
(,\d{3})* zero or more: comma-digit-digit-digit groups
(\.\d*){0,1} zero or one: decimal point followed by any number of digits
\){0,1} zero or one: close-paren
Any string failing to match this pattern could warrant an error message.
This example is of course dollar-oriented; you may wish to make your
logic apply equally to foreign currencies. Note that different
cultures have very different ways of expressing numbers -- comma for
the decimal point and period for the thousands separator, different
numbers of digits between separators, and different characters mixed
with the digits to indicate scale.
Once you accept the input, then you could delete all the characters
that aren't digits or period. Keep that decimal point, it's too
significant to lose.
Regards,
Paul
__________________________
Paul Novitski
Juniper Webcraft Ltd.
http://juniperwebcraft.com
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php