在Grails Domain Classes中存储phoneNumbers?

时间:2015-07-03 20:21:54

标签: grails gorm gsp

我想在Grails域类中存储电话号码。我不确定这样做的最佳方法是什么。存储为int似乎不是一个好主意,因为前导零是不可能的。

在Grails域类中存储和验证电话号码的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

您最有可能使用matches约束并将phone numbers存储为String,因为没有预定义的电话号码限制。在匹配中,您可以根据需要使用任何正则表达式模式。

 static constraints = {
phone(matches: "^(?:0091|\\+91|0)[7-9][0-9]{9}$")
}

以上正则表达式的工作方式如下: -

  1. 从0开始,+ 91或0091
  2. 其次是7-9
  3. 紧跟9个数字
  4. 必须匹配整个输入
  5. 您可以根据需要进行更改。

答案 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 - nullableblank。出于显示目的,只需在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是正确的位置 - 执行一些过滤和在显示应该是正确的输入材料之前,在其他帖子中建议进行验证。