214 lines
4.8 KiB
Markdown
214 lines
4.8 KiB
Markdown
|
|
# IS NUMERIC
|
||
|
|
|
||
|
|
The `IS NUMERIC` function tests whether a string value can be converted to a number. This is essential for input validation before performing mathematical operations.
|
||
|
|
|
||
|
|
## Syntax
|
||
|
|
|
||
|
|
```basic
|
||
|
|
result = IS NUMERIC(value)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Parameters
|
||
|
|
|
||
|
|
| Parameter | Type | Description |
|
||
|
|
|-----------|------|-------------|
|
||
|
|
| `value` | string | The value to test for numeric content |
|
||
|
|
|
||
|
|
## Return Value
|
||
|
|
|
||
|
|
- Returns `true` if the value can be parsed as a number
|
||
|
|
- Returns `false` if the value contains non-numeric characters
|
||
|
|
|
||
|
|
## Description
|
||
|
|
|
||
|
|
`IS NUMERIC` examines a string to determine if it represents a valid numeric value. It recognizes:
|
||
|
|
- Integers: `42`, `-17`, `0`
|
||
|
|
- Decimals: `3.14`, `-0.5`, `.25`
|
||
|
|
- Scientific notation: `1e10`, `2.5E-3`
|
||
|
|
|
||
|
|
Empty strings and strings containing letters or special characters (except `-`, `.`, `e`, `E`) return `false`.
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
### Basic Validation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
input = HEAR "Enter a number:"
|
||
|
|
IF IS NUMERIC(input) THEN
|
||
|
|
TALK "You entered: " + input
|
||
|
|
ELSE
|
||
|
|
TALK "That's not a valid number"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Bot Memory with Default Value
|
||
|
|
|
||
|
|
```basic
|
||
|
|
max_items = GET BOT MEMORY "max_items"
|
||
|
|
IF max_items = "" OR NOT IS NUMERIC(max_items) THEN
|
||
|
|
max_items = "10"
|
||
|
|
END IF
|
||
|
|
|
||
|
|
TALK "Processing up to " + max_items + " items"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Input Loop Until Valid
|
||
|
|
|
||
|
|
```basic
|
||
|
|
valid = false
|
||
|
|
DO WHILE NOT valid
|
||
|
|
age = HEAR "Enter your age:"
|
||
|
|
IF IS NUMERIC(age) THEN
|
||
|
|
valid = true
|
||
|
|
ELSE
|
||
|
|
TALK "Please enter a number"
|
||
|
|
END IF
|
||
|
|
LOOP
|
||
|
|
TALK "Your age is " + age
|
||
|
|
```
|
||
|
|
|
||
|
|
### Combined Conditions with OR NOT
|
||
|
|
|
||
|
|
```basic
|
||
|
|
quantity = HEAR "How many items?"
|
||
|
|
IF quantity = "" OR NOT IS NUMERIC(quantity) THEN
|
||
|
|
TALK "Invalid quantity, using default of 1"
|
||
|
|
quantity = "1"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Validating Multiple Fields
|
||
|
|
|
||
|
|
```basic
|
||
|
|
price = HEAR "Enter price:"
|
||
|
|
quantity = HEAR "Enter quantity:"
|
||
|
|
|
||
|
|
IF IS NUMERIC(price) AND IS NUMERIC(quantity) THEN
|
||
|
|
total = price * quantity
|
||
|
|
TALK "Total: $" + total
|
||
|
|
ELSE
|
||
|
|
IF NOT IS NUMERIC(price) THEN
|
||
|
|
TALK "Price must be a number"
|
||
|
|
END IF
|
||
|
|
IF NOT IS NUMERIC(quantity) THEN
|
||
|
|
TALK "Quantity must be a number"
|
||
|
|
END IF
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Configuration Validation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Load timeout from config, validate it's numeric
|
||
|
|
timeout = GET BOT MEMORY "api_timeout"
|
||
|
|
IF NOT IS NUMERIC(timeout) THEN
|
||
|
|
timeout = "30"
|
||
|
|
SET BOT MEMORY "api_timeout", timeout
|
||
|
|
TALK "Set default timeout to 30 seconds"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Range Checking After Validation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
rating = HEAR "Rate from 1-5:"
|
||
|
|
|
||
|
|
IF NOT IS NUMERIC(rating) THEN
|
||
|
|
TALK "Please enter a number"
|
||
|
|
ELSE IF rating < 1 OR rating > 5 THEN
|
||
|
|
TALK "Rating must be between 1 and 5"
|
||
|
|
ELSE
|
||
|
|
TALK "Thank you for your rating of " + rating
|
||
|
|
SET BOT MEMORY "last_rating", rating
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
## What IS NUMERIC Accepts
|
||
|
|
|
||
|
|
| Input | Result | Notes |
|
||
|
|
|-------|--------|-------|
|
||
|
|
| `"42"` | `true` | Integer |
|
||
|
|
| `"-17"` | `true` | Negative integer |
|
||
|
|
| `"3.14"` | `true` | Decimal |
|
||
|
|
| `".5"` | `true` | Leading decimal |
|
||
|
|
| `"1e10"` | `true` | Scientific notation |
|
||
|
|
| `"2.5E-3"` | `true` | Scientific with decimal |
|
||
|
|
| `""` | `false` | Empty string |
|
||
|
|
| `"abc"` | `false` | Letters |
|
||
|
|
| `"12abc"` | `false` | Mixed content |
|
||
|
|
| `"$100"` | `false` | Currency symbol |
|
||
|
|
| `"1,000"` | `false` | Thousands separator |
|
||
|
|
| `" 42 "` | `true` | Whitespace trimmed |
|
||
|
|
|
||
|
|
## Common Patterns
|
||
|
|
|
||
|
|
### Default Value Pattern
|
||
|
|
|
||
|
|
```basic
|
||
|
|
value = GET BOT MEMORY key
|
||
|
|
IF value = "" OR NOT IS NUMERIC(value) THEN
|
||
|
|
value = default_value
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Safe Division
|
||
|
|
|
||
|
|
```basic
|
||
|
|
divisor = HEAR "Enter divisor:"
|
||
|
|
IF NOT IS NUMERIC(divisor) THEN
|
||
|
|
TALK "Must be a number"
|
||
|
|
ELSE IF divisor = 0 THEN
|
||
|
|
TALK "Cannot divide by zero"
|
||
|
|
ELSE
|
||
|
|
result = 100 / divisor
|
||
|
|
TALK "Result: " + result
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Percentage Validation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
percent = HEAR "Enter percentage (0-100):"
|
||
|
|
IF IS NUMERIC(percent) THEN
|
||
|
|
IF percent >= 0 AND percent <= 100 THEN
|
||
|
|
TALK "Discount: " + percent + "%"
|
||
|
|
ELSE
|
||
|
|
TALK "Must be between 0 and 100"
|
||
|
|
END IF
|
||
|
|
ELSE
|
||
|
|
TALK "Enter a number without %"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
## Notes
|
||
|
|
|
||
|
|
- **Whitespace**: Leading and trailing spaces are trimmed before checking
|
||
|
|
- **Empty strings**: Always return `false`
|
||
|
|
- **Locale**: Uses period (.) as decimal separator
|
||
|
|
- **Currency**: Does not recognize currency symbols ($, €, etc.)
|
||
|
|
- **Separators**: Does not recognize thousands separators (commas)
|
||
|
|
|
||
|
|
## Error Prevention
|
||
|
|
|
||
|
|
Using `IS NUMERIC` prevents runtime errors when converting strings to numbers:
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Without validation - could cause error
|
||
|
|
value = HEAR "Enter number:"
|
||
|
|
result = value * 2 ' Error if value is "abc"
|
||
|
|
|
||
|
|
' With validation - safe
|
||
|
|
value = HEAR "Enter number:"
|
||
|
|
IF IS NUMERIC(value) THEN
|
||
|
|
result = value * 2
|
||
|
|
ELSE
|
||
|
|
TALK "Invalid input"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- [GET BOT MEMORY](./keyword-get-bot-memory.md) - Retrieve stored values
|
||
|
|
- [SET BOT MEMORY](./keyword-set-bot-memory.md) - Store values
|
||
|
|
- [INSTR](./keyword-instr.md) - Find substring position
|
||
|
|
- [FORMAT](./keyword-format.md) - Format numbers as strings
|