How to check if a string can be converted to float in Python?

When working with user input or data processing, you often need to check if a string can be converted to a float before performing the conversion. Python provides several approaches to validate float conversion safely.

Using float() with Exception Handling

The most reliable approach uses the float() function with try-except handling. This method attempts the conversion and catches any ValueError that occurs ?

def is_float(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

# Test with valid float string
str1 = "36.9"
print(f"'{str1}' can be converted to float: {is_float(str1)}")

# Test with invalid string
str2 = "Welcome"
print(f"'{str2}' can be converted to float: {is_float(str2)}")

# Test edge cases
test_cases = ["3.14", "-42.5", "0", "inf", "-inf", "nan", "3.14.15", ""]
for test in test_cases:
    print(f"'{test}': {is_float(test)}")
'36.9' can be converted to float: True
'Welcome' can be converted to float: False
'3.14': True
'-42.5': True
'0': True
'inf': True
'-inf': True
'nan': True
'3.14.15': False
'': False

Using String Methods with replace()

An alternative approach uses replace() and isdigit() methods. However, this method has limitations with negative numbers and special float values ?

def is_float_simple(s):
    # Remove one decimal point and check if remaining characters are digits
    return s.replace('.', '', 1).isdigit()

# Test cases
test_strings = ["69.3", "Welcome", "42", "-15.5", "3.14.15"]

for test in test_strings:
    result = is_float_simple(test)
    print(f"'{test}': {result}")
'69.3': True
'Welcome': False
'42': True
'-15.5': False
'3.14.15': False

Enhanced String Validation Method

Here's an improved string-based approach that handles negative numbers and more edge cases ?

def is_float_enhanced(s):
    if not s:
        return False
    
    # Handle negative numbers
    if s.startswith('-'):
        s = s[1:]
    
    # Check for special float values
    if s.lower() in ['inf', 'infinity', 'nan']:
        return True
    
    # Split by decimal point
    parts = s.split('.')
    
    # Should have at most 2 parts (before and after decimal)
    if len(parts) > 2:
        return False
    
    # Check if all parts contain only digits
    return all(part.isdigit() for part in parts if part)

# Test the enhanced method
test_cases = ["3.14", "-42.5", "inf", "-inf", "nan", "3.14.15", "Welcome", ""]
for test in test_cases:
    print(f"'{test}': {is_float_enhanced(test)}")
'3.14': True
'-42.5': True
'inf': True
'-inf': True
'nan': True
'3.14.15': False
'Welcome': False
'': False

Comparison of Methods

Method Handles Negatives Handles inf/nan Performance Accuracy
float() + try/except Yes Yes Slower 100%
replace() + isdigit() No No Faster Limited
Enhanced string method Yes Yes Fast Good

Conclusion

Use float() with try-except for the most reliable validation. The string-based methods are faster but have limitations with edge cases like negative numbers and special float values.

Updated on: 2026-03-24T16:45:45+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements