Challanges representing hexadecimal values as "integer double" in uitable

10 vues (au cours des 30 derniers jours)
Tord Fjordheim Onstein
Tord Fjordheim Onstein le 10 Sep 2021
In a uitable, I’m editing multiple cells and I want to use hexadecimal (integer) as the input value. For most cases this turns out perfectly fine. However, hexadecimal values ending with 'e' are causing me a headache. It seems that Matlab interprets the input as string and converts the hexadecimal input (0xXXXX, without quotation marks) using ‘str2double’ before any callbacks are triggered. ‘str2double’ uses ‘sscanf’ behind the scenes and in ‘str2double’, ‘sscanf’ is called with format specifier ‘%f’. This makes sense when ‘str2double’ tries to convert to a double value. When ‘sscanf’ is called with ‘%f’, it probably triggers on the trailing ‘e’ for scientific notation. There is no value proceeding ‘e’ and ‘str2double’ fails to read the entire char-array and returns NaN.
I am able to catch the NaN-value and re-evaluate the string using ‘myStr2double’, where I call ‘sscanf’ with format specifier ‘%i’. This works, but it seems like an unnecessary step as not doing this works for all hexadecimal values (I’ve tested) except for those ending with ‘e’.
Here are some sample code to illustrate the problem:
str2double('0x1234')
returns 4660 (as expected)
str2double('0x123e')
returns NaN.
Is there a better solution to this behaviour, or am I trying to do something that is just outside of the intention?
In ‘myStr2double’, i call:
[a,count,errmsg,nextindex] = sscanf(s,'%i',1)
to read the entire hexadecimal char-array.
  3 commentaires
Stephen23
Stephen23 le 18 Déc 2021
Modifié(e) : Stephen23 le 18 Déc 2021
"...am I trying to do something that is just outside of the intention?"
Yes. STR2DOUBLE is not documenented to convert hexadecimal numbers. For reliable conversion use functions which are designed and documented for converting hexadecimal, e.g. HEX2DEC, SSCANF.
Tord Fjordheim Onstein
Tord Fjordheim Onstein le 20 Déc 2021
Thank you for the input, Stephen. I just want to clarify. STR2DOUBLE is the default callback for cell-edits in a uitable, so what I am doing wrong is expecting everything to work fine using a uitable to enter numerical values by their hexadecimal representation. This might not allways be the case. Sometimes I want to enter the data as numerical integers. HEX2DEC expects text input. Matlab interprets 0x1234 (not ''0x1234') as an unsigned integer of appropriate size and thus SSCANF (with integer formatspecifier) does the job of juggeling numeric and hexadecimal integers. I handle this by setting a custom 'CellEditCallback' for my table.

Connectez-vous pour commenter.

Réponses (1)

Voss
Voss le 18 Déc 2021
Maybe using hex2dec instead of str2double will work:
str2double('0x1234')
ans = 4660
str2double('0x123e')
ans = NaN
hex2dec('0x1234')
ans = 4660
hex2dec('0x123e')
ans = 4670
  4 commentaires
Walter Roberson
Walter Roberson le 20 Déc 2021
preprocess to determine which conversion to apply.
Tord Fjordheim Onstein
Tord Fjordheim Onstein le 20 Déc 2021
Ahh, my last comment is also not correct. As the original post is a few months old, my comments was out of memory and not the actual implementation. Edits in the cells are interpreted as text (char array) , making HEX2DEC a viable option if I do the correct preprocessing of the text. However, SSCANF already handles this distinction.
From the documentation of SSCANF for format specifier %i:
The values determine the base:
  • The default is base 10.
  • If the initial digits are 0x or 0X, then the values are base 16 (hexadecimal).
  • If the initial digit is 0, then values are base 8 (octal).
Given the time, I will add a new answear and close this question later this week, though probably not on friday :-)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Data Type Conversion dans Help Center et File Exchange

Produits


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by