Skip to content

java.lang.NumberFormatException: Character N is neither a decimal digit number, decimal point, nor “e” notation exponential mark.

Cause of the Exception

The error message:

java.lang.NumberFormatException: Character N is neither a decimal digit number, decimal point, nor "e" notation exponential mark.

indicates that an invalid character (N) was passed to the BigDecimal constructor. The constructor expects a valid numerical string but received a value that includes a non-numeric character.

Where the Issue Happens

Looking at the stack trace, the error occurs in:

at java.base/java.math.BigDecimal.<init>(BigDecimal.java:512)
at java.base/java.math.BigDecimal.valueOf(BigDecimal.java:1298)
at eu.hansolo.medusa.skins.ModernSkin.drawTickMarks(ModernSkin.java:560)

This suggests that the ModernSkin.drawTickMarks method in the Medusa JavaFX library is processing a numeric value that contains an invalid character.

Possible Causes

  1. NaN (Not a Number) Value
    • If a calculation results in Double.NaN, and it is passed to BigDecimal.valueOf(), it will cause this error.
    • Example:
      double value = Double.NaN;
      BigDecimal bigDecimal = BigDecimal.valueOf(value); // Throws NumberFormatException
      
  2. Invalid String Format in Data Source
    • If you are using data from a file, database, or user input, and it contains non-numeric characters, this will trigger the error.
    • Example:
      String invalidNumber = "NaN";  // Or "NULL", "N/A", "UNKNOWN"
      BigDecimal bigDecimal = new BigDecimal(invalidNumber); // Error
      
  3. Incorrect Parsing from JSON, CSV, or Database
    • If the value in your dataset is "N/A", "NULL", "NaN", or anything that is not a valid number, it will cause this error.

How to Fix It

1. Check for NaN Before Converting

Modify the code where you create BigDecimal objects to check for invalid values:

double value = getSomeDoubleValue();
if (Double.isNaN(value) || Double.isInfinite(value)) {
    value = 0.0; // or some default value
}
BigDecimal bigDecimal = BigDecimal.valueOf(value);

2. Validate Input Strings

If you are working with string-based numeric values, validate them before conversion:

String numberStr = getNumberString(); // Example: "NaN", "123.45"
if (numberStr == null || !numberStr.matches("-?\\d+(\\.\\d+)?")) {
    numberStr = "0"; // Default value
}
BigDecimal bigDecimal = new BigDecimal(numberStr);

3. Check Data Source (Database, API, File)

If the numbers come from an external source, check whether they contain "NaN", "N/A", "NULL", or unexpected characters.

4. Debugging Steps

  • Print the values passed to BigDecimal.valueOf() in ModernSkin.drawTickMarks():
    System.out.println("Value being converted: " + value);
    
  • If you are using a dataset, verify that all values are numeric.

Would you like help pinpointing where in your JavaFX application this issue originates?

Leave a Reply

Discover more from Sowft | Transforming Ideas into Digital Success

Subscribe now to keep reading and get access to the full archive.

Continue reading