Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
package grails.plugin.formfields

import java.sql.Blob
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.text.NumberFormat
import java.time.Instant
import java.time.LocalDate
Expand Down Expand Up @@ -833,7 +835,15 @@ class FormFieldsTagLib {

@CompileStatic
protected NumberFormat getNumberFormatter() {
NumberFormat.getInstance(getLocale())
NumberFormat numberFormat = NumberFormat.getInstance(getLocale())
// Normalize Unicode minus sign (U+2212) to ASCII hyphen-minus (U+002D)
// for HTML compatibility (fixes grails-core#15178)
if (numberFormat instanceof DecimalFormat) {
DecimalFormatSymbols symbols = ((DecimalFormat) numberFormat).decimalFormatSymbols
symbols.minusSign = '-' as char
((DecimalFormat) numberFormat).decimalFormatSymbols = symbols
}
return numberFormat
}

@CompileStatic
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import org.grails.scaffolding.model.property.Constrained
import spock.lang.Issue
import spock.lang.Shared
import spock.lang.Unroll
import org.springframework.web.servlet.i18n.FixedLocaleResolver

import java.sql.Blob
import java.time.LocalDate
Expand Down Expand Up @@ -698,6 +699,27 @@ class DefaultInputRenderingSpec extends AbstractFormFieldsTagLibSpec implements
Integer | 'range' | /input type="range"/
}

@Issue('https://github.com/apache/grails-core/issues/15178')
def "input value for a negative number with #locale locale uses ASCII minus sign"() {
given:
def model = [type: int, property: "salary", value: -42, constraints: null, persistentProperty: basicProperty]
def object = new Employee(salary: -42)
BeanPropertyAccessor accessor = factory.accessorFor(object, "salary")

and:
tagLib.localeResolver = new FixedLocaleResolver(Locale.forLanguageTag(locale.replace('_', '-')))

when:
def output = tagLib.renderDefaultInput(accessor, model) as String

then: "value attribute contains ASCII minus (U+002D), not Unicode minus (U+2212)"
output =~ /value="-/
!output.contains('\u2212')

where:
locale << ['nb_NO', 'nn_NO', 'sv_SE', 'fi_FI', 'en_US']
}

}

enum EnumWithToString {
Expand Down
Loading