Я думаю, что это проблема Java. Если вы отлаживаете свою программу, ваш Double будет всегда отображаться с научной точки зрения, поэтому мы хотим, чтобы он был в String. Это может быть достигнуто на Java несколькими способами, и вы можете найти его здесь:
Как печатать двойное значение без научной нотации с использованием Java?
Что касается вашего конкретного вопроса о Jackson, я написал для вас код:
public class ObjectMapperTest {
public static void main(String[] args) throws JsonProcessingException {
IntegerSchema schema = new IntegerSchema();
schema.type = "Int";
schema.max = 10200000000d;
schema.min = 100d;
ObjectMapper m = new ObjectMapper();
System.out.println(m.writeValueAsString(schema));
}
public static class IntegerSchema {
@JsonProperty
String type;
@JsonProperty
double min;
@JsonProperty
@JsonSerialize(using=MyDoubleDesirializer.class)
double max;
}
public static class MyDoubleDesirializer extends JsonSerializer {
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
// TODO Auto-generated method stub
BigDecimal d = new BigDecimal(value);
gen.writeNumber(d.toPlainString());
}
}
}
Трюк заключается в регистрации пользовательского Serializer для вашего двойного значения. Таким образом, вы можете контролировать то, что хотите.
Я использую значение BigDecimal для создания строкового представления вашего Double. Затем выход будет (для конкретного примера):
{"type":"Int","min":100.0,"max":10200000000}
Надеюсь, что это решает вашу проблему.
Artur
Вероятно, для устранения кого-то вводящего 7 вместо 8 так как использование для произвольных оснований - немногие (Но не не существующее).
Вот метод в качестве примера, который может сделать произвольные основные преобразования. Можно использовать его, если Вам нравится, никакие ограничения.
string ConvertToBase(int value, int toBase)
{
if (toBase < 2 || toBase > 36) throw new ArgumentException("toBase");
if (value < 0) throw new ArgumentException("value");
if (value == 0) return "0"; //0 would skip while loop
string AlphaCodes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string retVal = "";
while (value > 0)
{
retVal = AlphaCodes[value % toBase] + retVal;
value /= toBase;
}
return retVal;
}
Непротестированный, но необходимо смочь изобразить его из здесь.
Вы могли дать http://www.codeproject.com/KB/macros/Convert.aspx попытку.
Вы могли попробовать следующее:
http://www.dotnetspider.com/resources/938-Conversion-Decimal-number-any-Base-vice.aspx
Это, по крайней мере, производит впечатление, что у Вас могла быть любая основа (от 2-> 16). Хотя я немного смущен относительно того, почему Вы хотели бы!
//untested -- public domain
// if you do a lot of conversions, using StringBuilder will be
// much, much more efficient with memory and time than using string
// alone.
string toStringWithBase(int number, int base)
{
if(0==number) //handle corner case
return "0";
if(base < 2)
return "ERROR: Base less than 2";
StringBuilder buffer = new StringBuilder();
bool negative = (number < 0) ? true : false;
if(negative)
{
number=-number;
buffer.Append('-');
}
int digits=0;
int factor=1;
int runningTotal=number;
while(number > 0)
{
number = number/base;
digits++;
factor*=base;
}
factor = factor/base;
while(factor >= 1)
{
int remainder = (number/factor) % base;
Char out = '0'+remainder;
if(remainder > 9)
out = 'A' + remainder - 10;
buffer.Append(out);
factor = factor/base;
}
return buffer.ToString
}
string foo = Convert.ToString(myint,base);
http://msdn.microsoft.com/en-us/library/14kwkz77.aspx
Править: Мое плохое, это выдаст исключение аргумента, если Вы не передадите в указанных основаниях (2, 8, 10, и 16)
Ваш, вероятно, СОЛЬ, если Вы хотите использовать другую основу (но почему???).
Извините, я не отвечаю на ваш вопрос, но ... Выбор баз не произвольный. Ваш компьютер постоянно преобразует базу 2 (внутренняя двоичная система) в удобочитаемую базу 10. Базы 8 и 16 очень легко преобразовать в и из базы 2 и часто используются, чтобы компьютер И человек мог прочитать значение ( например, GUID)