我想在Grails域类中存储电话号码。我不确定这样做的最佳方法是什么。存储为int似乎不是一个好主意,因为前导零是不可能的。
在Grails域类中存储和验证电话号码的最佳方法是什么?
答案 0 :(得分:0)
您最有可能使用matches
约束并将phone numbers
存储为String
,因为没有预定义的电话号码限制。在匹配中,您可以根据需要使用任何正则表达式模式。
static constraints = {
phone(matches: "^(?:0091|\\+91|0)[7-9][0-9]{9}$")
}
以上正则表达式的工作方式如下: -
您可以根据需要进行更改。
答案 1 :(得分:0)
您可以将电话号码存储为字符串。要验证电话号码,您可以使用谷歌电话号码java库来验证国际号码。或者更容易,您可以在代码中使用此grails插件:https://github.com/ataylor284/grails-phonenumbers。以下是插件主页中的示例。
class MyDomain {
String phoneNumber
static constraints = {
phoneNumber(phoneNumber: true)
}
}
编辑: 要验证数字是否为空,您必须定义扩展PhoneNumberConstraint类的自定义约束类。
class CustomPhoneNumberConstraint extends PhoneNumberConstraint{
@Override
protected void processValidate(target, propertyValue, Errors errors) {
//check if phone number is blank
if (propertyValue instanceof String && GrailsStringUtils.isBlank((String)propertyValue)) {
if (!blank) {
super.processValidate(target,propertyValue, errors)
}
}
return true
}
}
答案 2 :(得分:0)
我会将手机存储为String
- nullable
和blank
。出于显示目的,只需在grails的tablib
包中提供您自己的标记即可。
例如,在某个域类中有一个属性,如下所示:
String phone
像这样的taglib类:
class MyTagLib {
static defaultEncodeAs = [taglib:'html']
def phone334 = { attrs ->
String phone = attrs.phone
def formatted =
"(".concat(phone.substring(0, 3)).concat(") ")
.concat(phone.substring(3, 6)).concat("-").concat(phone.substring(6))
out << formatted
}
}
和gsp中的这样的用法:
<g:phone334 phone="${theInstance.phone}" />
然后,如果phone = '4165557799'
,输出将显示如下:(416) 555-7799
。
您可以根据需要构建任意数量的格式化程序;例如,如果您的数字为011218213334488
并且您需要它看起来像+(218) 21 333 4488
,则只需根据输入中检测到的长度和/或模式构建格式化程序。
您也可以在那里构建简单的验证器,以确保例如所有字符都由数字,括号和破折号组成,但我不认为taglibs是正确的位置 - 执行一些过滤和在显示应该是正确的输入材料之前,在其他帖子中建议进行验证。