Вот способ использования sub2ind
. Я не рассчитывал это:
sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = sub2ind(sz([1 2 3]), coordinates(:,1), coordinates(:,2), coordinates(:,3));
M(ind(:),:) = timeseries;
M = reshape(M, sz);
Вы можете немного увеличить скорость, заменив sub2ind
на ручной расчет:
sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = coordinates(:,1) + sz(1)*(coordinates(:,2)-1) + sz(1)*sz(2)*(coordinates(:,3)-1);
M(ind(:),:) = timeseries;
M = reshape(M, sz);
String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))
Приведет к (123) 456-7890 x 123
Я просто использовал бы пользовательскую строку формата для преобразования числа назад в строку:
class Program
{
static void Main(string[] args)
{
long phoneNumber = 12345678901234;
string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
Console.WriteLine(phoneNumberString);
}
}
Конечно, Вы факторизовали бы его в функцию, которая возьмет номер телефона в качестве длинного и затем возвратит строку (с форматом, загруженным или сохраненным как константа в методе или что-то подходящее для Вашей ситуации).
О, и если у Вас есть он в строке и не длинном, можно легко преобразовать строку в длинное, и затем передать ее функции формата. Конечно, существуют соображения производительности здесь при выполнении его неоднократно (так как Вы выполняете итерации строки для создания длинного, и затем преобразовываете ее назад в строку, когда Вы могли просто использовать подстроку).
Используя regex можно заменить:
(\d{3})(\d{3})(\d{4})(\d{4})
с:
(\1) \2-\3 x\4
(Хотя я не знаком с американскими номерами телефона поэтому, возможно, существует больше к нему.)
Если Вы только поддерживаете американские числа, Вы могли бы просто отформатировать цифры для показа круглой скобки и x везде, где Вы хотите.
Я предпочел бы хранить целую строку, я проанализирую ее с помощью regex для проверки ее, затем сохраню ее в нормализованной строке.
Чтобы заставить его принять любую страну, я сделал бы это:
Я добавил бы код IDD ко всем номерам телефона и затем скрыл бы его от пользователей из той страны.
так: (123) 456-7890 x1234 был бы сохранен как +1 (123) 456-7890 x1234
(Perl-совместимый) regex был бы чем-то как (полностью непротестированный, и не будет работать):
(+ \d +)?\s + (((\d {3})) (? \s + ([-.0-9] {6}) \s + ((x|ext\w*)\d {4})
Я имел бы базу данных пользователей включая код страны и код области, затем заполнил бы тех автоматически в случае, если они отсутствуют, страна имела бы, это - конвенция группировки цифры по умолчанию для номеров телефона (3,4 для нас).
Международный код не будет отображен для пользователей в той же стране, и код области не будет отображен для пользователей в том же коде страны и коде области. Полное число было бы отображено onmouseover (маркировка HTML?)
Необходимо ли сломать его для DB? В противном случае не делайте. Если Вы ДОЛЖНЫ, то можно или сохранить различные части в различных полях, (Areacode, Префикс, SubscriberNum, Extenion).
Или, извлеките число и начните анализировать. Если это - только 10 цифр, то Вы знаете, что нет никакого расширения. Все цифры прошлые 10, засуньте их в строку после 'x' или чего-то.
Я сделал что-то подобное этому в приложении C++, которое я записал сохраненным различным механизмам контакта как единственной строке, но вместо этого, я сделал реверс того, что Вы делаете. Я взял поля от диалогового окна и создал отформатированное число для хранения как строка.
Вот дополнительный метод, который мог бы помочь:
public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
if (str != null && insertStr != null && positions != null)
{
string newString = string.Empty;
int previousPos = 0;
foreach (var pos in positions)
{
if (pos < str.Length)
{
newString += str.Substring(previousPos, pos - previousPos) + insertStr;
previousPos = pos;
}
}
if (positions.Last() < str.Length)
{
return newString + str.Substring(positions.Last(), str.Length - positions.Last());
}
return newString;
}
return str;
}
Использование:
// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});