Since using parseInt is a popular input option, I wrote a simple function to parse input as rolls that might help other sheet developers.  Given a string input, it parses it either as a number or a roll, depending on the content. It accepts all kinds of roll operations,  and the roll needs to terminate in a number, a space, or a closed parenthesis; the  result is returned, removing the spaces and uppercasing the dice const parseRoll = ( roll ) => {     const regex_int = / ^ (\s * [ \+\- ] ? \d {1,100} \s * ) $ / ;     const regex_roll   = / ^ ((\s * [ \+ \- \(\) ]\s * ) {0,4}? \d {0,10} [dD] ? \d {1,10} ((\s * [ \+ \- \*\/\(\) ]\s * ) {0,4}? \d {0,10} [dD] ? \d {1,10} ) * (\s * [ \) ]\s * ) {0,4}? ) + $ /     if ( regex_int . test ( roll )) { return parseInt ( roll );}     if ( regex_roll . test ( roll )) { return roll . replace ( /\s/ g , '' ). toUpperCase ();}     return 0 ; } "Compute" the minimum and maximum of a roll, which is useful if you pass the value to a roll template for fumbles and critical.  const maxRoll = (roll) => {   if ( isNaN ( Number ( roll )) == false ) { return roll ;}     return parseRoll ( roll ). replace ( /[dD]/ g , '*' ) } const minRoll = ( roll ) => {     if ( isNaN ( Number ( roll )) == false ) { return roll ;}     return parseRoll ( roll ). replace ( /[dD]\d {1,100} / g , '' ) }